QT去除控制元件被選中後的焦點虛線框
一、參考資料
二、寫在前面的廢話
焦點虛線框可以讓我們很清楚的瞭解到當前被選中的按鈕是哪個,但是有時候卻會影響我們辛苦設計的介面的美觀性,這時候就想去除焦點虛線框,今天在改的tabWidget時就遇到了這個問題,經過了三四個小時的鬥爭終於解決,記錄一下.
三、解決
在網上找到了兩種解決方法(原文連結已賦在前方):
- 1.用qss,一句話搞定;
- 2.再寫一個類,然後應用到main函式裡.
兩種方法在我的專案中效果不同,這裡都記錄一下:
1.用qss,一句話搞定
在qss檔案中加上下面這行程式碼(下面號外裡有怎麼新建qss檔案並呼叫)
QWidget:focus{outline : none;} /*remove all QWidget's focus border*/
只有一行,感覺很神奇,上面是對QWidget做的限制,如果你想對按鈕或者輸入框做限制,換成相應的QPushButton,QLineEdit即可.
或者用下面的這行也可以
QPushButton:focus{padding: -1;} // 具體負多少可以調節
專案應用:這種方法應用在我的專案裡時,button的聚焦虛線框確實沒有了,但是也把我整個專案的設計給毀了,同時,tabWidget控制元件的虛線框也沒去掉,所以,失敗了
2.再寫一個類,然後應用到main函式裡.
然後再說自定義類的這個,也很簡單的,直接上程式碼(號外
#ifndef MYPROXYSTYLE_H
#define MYPROXYSTYLE_H
#include <QProxyStyle>
#include <QStyleOption>
#include <QPainter>
#include <QWidget>
//去除視窗部件的系統焦點邊框;
class MyProxyStyle : public QProxyStyle
{
public:
virtual void drawPrimitive(PrimitiveElement element, const QStyleOption * option,
QPainter * painter, const QWidget * widget = 0) const
{
if (PE_FrameFocusRect == element)
{
//這裡不做任何操作,Qt預設是繪製矩形虛線框
}
else
{
QProxyStyle::drawPrimitive(element, option,painter, widget);
}
}
};
#endif // MYPROXYSTYLE_H
#include "myproxystyle.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//新增style為這個工程的所有視窗都去除了矩形虛線框
qApp->setStyle(new MyProxyStyle);
//其他操作...
return a.exec();
}
四、號外
1、qss檔案是qt的樣式檔案,使用它可以將專案的功能和ui設計分離開,相互獨立,比較方便,也比較直觀
新建:
在專案程式碼檔案的根目錄下新建一個資料夾,起名qss
=> 在qss資料夾裡新建空文件並寫入樣式程式碼
=> 將檔案字尾名改為.qss(比如:myStyle.qss)
=> 在qtcreator中滑鼠右擊檔名
=> 新增新檔案
=> 選擇 Qt - Qt Resource File - choose
=> 名稱隨便(比如qss)
=> 下一步
=> 完成
=> 滑鼠右擊剛新建的qrc檔案(我這裡是qss.qrc)
=> 新增現有檔案
=> 找到你剛新建的.qss檔案(我這裡是:myStyle.qss),選中
=> 開啟
新建完成
呼叫:
#include <QFile> // 別忘了這個
QFile styleSheet(":/qss/myStyle.qss");
if (!styleSheet.open(QIODevice::ReadOnly))
{
qWarning("Can't open the style sheet file.");
return;
}
qApp->setStyleSheet(styleSheet.readAll());
2、新建類函式
1)這裡我們是過載了現有類的一個函式,對我們所需要的效果進行重新繪製,即用給定的option和painter來繪製element。
2)形參說明:
PrimitiveElement:指明想要繪製的圖形元素
QStyleOption:指明想要的該圖形元素的樣式
QPainter:用於繪製該元素
QWidget:將被繪製的物件(這是可選的)
3)下表(譯自官方文件)列出了primitive element及其關聯的style option子類(Style Flag和備註裡面的序號是一一對應的)。
雖然表中的大多數都看不懂,但是從這個表中我們可以發上面if語句的判斷條件正是對應的第一條,也可以理解為什麼那麼寫了
Primitive Element | QStyleOption Subclass | Style Flag | 備註 |
---|---|---|---|
PE_FrameFocusRect | QStyleOptionFocusRect | State_FocusAtBorder | 焦點是在邊框還是在視窗小部件內 |
PE_IndicatorCheckBox | QStyleOptionButton | ①State_NoChange ②State_On ③State_On ④State_NoChange ⑤State_Enabled | ①表示“三態”複選框 ②表示指示符已選中 ③表示選擇了單選按鈕 ④表示“三態”控制器 ⑤表示控制器已啟用 |
PE_IndicatorBranch | QStyleOption | ①State_Children ②State_Item ③State_Open ④State_Sibling | ①表示應該用於繪製展開樹以顯示子控制元件 ②表示應該用於繪製一個水平分支(以顯示子控制元件) ③表示擴充套件了樹分支 ④表示應該用於繪製一條垂直線(以顯示同級專案) |
PE_IndicatorHeaderArrow | QStyleOptionHeader | State_UpArrow | 表示應制定箭頭; 否則應該向下 |
PE_FrameGroupBox, PE_Frame, PE_FrameLineEdit, PE_FrameMenu, PE_FrameDockWidget, PE_FrameWindow | QStyleOptionFrame | State_Sunken | 表示框架應凹陷 |
PE_IndicatorToolBarHandle | QStyleOption | State_Horizontal | 表示視窗控制代碼是水平的,而不是垂直的 |
PE_IndicatorSpinPlus, PE_IndicatorSpinMinus, PE_IndicatorSpinUp, PE_IndicatorSpinDown | QStyleOptionSpinBox | State_Sunken | 表示按下按鈕 |
PE_PanelButtonCommand | QStyleOptionButton | ①State_Enabled ②State_HasFocus ③State_Raised ④State_On ⑤State_Sunken | ①如果按鈕已啟用,請設定 ②如果按鈕具有輸入焦點,請設定 ③如果按鈕沒有按下,沒有啟用,也不扁平,請設定 ④如果該按鈕是切換按鈕並且正被切換,請設定 ⑤如果按鈕被按下(比如,滑鼠按鈕或者空格鍵在按鈕上被按下) |
翻譯的不準的地方還請大家見諒,懇請批評指正,先謝過了!