1. 程式人生 > >QT去除控制元件被選中後的焦點虛線框

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 ①如果按鈕已啟用,請設定 ②如果按鈕具有輸入焦點,請設定 ③如果按鈕沒有按下,沒有啟用,也不扁平,請設定 ④如果該按鈕是切換按鈕並且正被切換,請設定 ⑤如果按鈕被按下(比如,滑鼠按鈕或者空格鍵在按鈕上被按下)

翻譯的不準的地方還請大家見諒,懇請批評指正,先謝過了!