Qt中的屬性設置(蒐集整理)

1、Qt中的屬性

屬性是指窗口或控件的屬性,好比opacity屬性表示「透明度」,geometry指的是「位置和大小」,pos屬性表明「位置」。qt中的控件有自帶的屬性,咱們也能夠本身定義屬性。css

QObject這個類有一個函數setProperty,咱們能夠經過這個函數定義本身的屬性,使用方法很簡單,setProperty(const char * name, const QVariant & value),第一個參數是屬性的名稱,第二個參數是屬性值。ide

除了上面的方法,還有一種自定義屬性的方法,就是使用Q_PROPERTY這個宏,簡單用法以下:函數

Q_PROPERTY(type name READ getFunction WRITE setFunction)動畫

Q_PROPERTY(參數類型 參數名稱 READ 得到屬性值函數 WRITE 設置屬性值函數)ui

好比Q_PROPERTY(bool bIsDoubi READ getDoubi WRITE setDoubi),屬性類型是bool類型,bIsDoubi是屬性名稱。除此以外還須要寫兩個函數,第一個是設置屬性的函數void setDoui(bool),第二個是得到屬性的函數bool getDoubi()。this

2、自定義屬性有什麼用

我目前所知的自定義屬性有兩個用途,第一是用於改變樣式,第二是用於動畫,下面分別做解釋。spa

3、改變樣式

翻開Qt助手,找到樣式表語法部分,在經過選擇器設置樣式中有一個屬性選擇器,好比QPushButton[flat="false"]意思就是當按鈕屬性flat爲false時的樣式。code

舉個栗子,咱們有個類,名字叫PropertyTest,在界面中有個按鈕,名字叫pushButton_3orm

1
2
3
4
#pushButton_ 3 { border : 4px  solid  blue ;}
PropertyTest[borderColor= "red" ] #pushButton_ 3 { border : 4px  solid  red ;}
PropertyTest[borderColor= "green" ] #pushButton_ 3 { border : 4px  solid  green ;}
PropertyTest[borderColor= "blue" ] #pushButton_ 3 { border : 4px  solid  blue ;}

上面的樣式意思是,按鈕默認樣式是blue藍色,經過改變類PropertyTest的屬性borderColor值改變按鈕的顏色。對象

在代碼中,首先定義屬性

1
Q_PROPERTY(QString borderColor READ getBorderColor WRITE setBorderColor)

使用一個成員變量保存屬性的值,並經過set和get函數分別設置和得到該值。

1
2
3
4
5
private :
     QString m_strBorderColor;
private :
     void  setBorderColor( const  QString &strBorderColor){ m_strBorderColor = strBorderColor; }
     QString getBorderColor(){  return  m_strBorderColor; }

單擊按鈕pushButton改變屬性值,從而改變按鈕pushButton_3的樣式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void  PropertyTest::changeBorderColor()
{
     if  (m_iTest % 3 == 0)
     {
         setBorderColor( "red" );
     }
     else  if  (m_iTest % 3 == 1)
     {
         setBorderColor( "green" );
     }
     else
     {
         setBorderColor( "blue" );
     }
     style()->unpolish(ui.pushButton_3);
     style()->polish(ui.pushButton_3);
     update();
     m_iTest++;
}

最後要注意的是,上面代碼中的unpolish和polish部分。

在助手中有個提醒,若是使用屬性選擇器的時候,以前已經有樣式,那麼有必要從新設置一下,就是先去掉以前的樣式,再添加新的樣式。也就是經過上面unpolish和polish兩個函數實現。

4、動畫中使用自定義屬性

若是咱們想要用一個動畫改變按鈕的透明度,由於按鈕QPushButton是繼承自QWidget的,在QWidget中有個函數setWindowOpacity,因此你會將動畫的屬性名稱設置爲windowOpacity。然而,最後透明度是不會有任何改變的,由於只有在setWindowFlags時設置爲Qt::Window,windowOpacity這個屬性才能生效。

所以,有必要尋求其它方法,在QWidget中有一個函數setGraphicsEffect(QGraphicsEffect *),其中QGraphicsEffect有一個派生類QGraphicsOpacityEffect,能夠經過它來設置QWidget的透明度。

1
2
3
m_pOpacityEffect =  new  QGraphicsOpacityEffect( this );
m_pOpacityEffect->setOpacity(1);
this ->setGraphicsEffect(m_pOpacityEffect);
1
Q_PROPERTY(qreal buttonOpacity READ buttonOpacity WRITE setBtnOpacity)

定義屬性時,在函數setBtnOpacity中改變QGraphicsOpacityEffect對象,來調整透明度。

好了,如今咱們將動畫屬性名稱設置爲buttonOpacity,就能改變按鈕的透明度了

相關文章
相關標籤/搜索