您好,登錄后才能下訂單哦!
屬性是指窗口或控件的屬性,比如opacity屬性表示“透明度”,geometry指的是“位置和大小”,pos屬性代表“位置”。qt中的控件有自帶的屬性,我們也可以自己定義屬性。
QObject這個類有一個函數(shù)setProperty,我們可以通過這個函數(shù)定義自己的屬性,使用方法很簡單,setProperty(const char * name, const QVariant & value),第一個參數(shù)是屬性的名稱,第二個參數(shù)是屬性值。
除了上面的方法,還有一種自定義屬性的方法,就是使用Q_PROPERTY這個宏,簡單用法如下:
Q_PROPERTY(type name READ getFunction WRITE setFunction)
Q_PROPERTY(參數(shù)類型 參數(shù)名稱 READ 獲得屬性值函數(shù) WRITE 設(shè)置屬性值函數(shù))
比如Q_PROPERTY(bool bIsDoubi READ getDoubi WRITE setDoubi),屬性類型是bool類型,bIsDoubi是屬性名稱。除此之外還需要寫兩個函數(shù),第一個是設(shè)置屬性的函數(shù)void setDoui(bool),第二個是獲得屬性的函數(shù)bool getDoubi()。
我目前所知的自定義屬性有兩個用途,第一是用于改變樣式,第二是用于動畫,下面分別作解釋。
翻開Qt助手,找到樣式表語法部分,在通過選擇器設(shè)置樣式中有一個屬性選擇器,比如QPushButton[flat="false"]意思就是當(dāng)按鈕屬性flat為false時的樣式。
舉個栗子,我們有個類,名字叫PropertyTest,在界面中有個按鈕,名字叫pushButton_3
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 ;} |
上面的樣式意思是,按鈕默認(rèn)樣式是blue藍(lán)色,通過改變類PropertyTest的屬性borderColor值改變按鈕的顏色。
在代碼中,首先定義屬性
1 | Q_PROPERTY(QString borderColor READ getBorderColor WRITE setBorderColor) |
使用一個成員變量保存屬性的值,并通過set和get函數(shù)分別設(shè)置和獲得該值。
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部分。
如果我們想要用一個動畫改變按鈕的透明度,因為按鈕QPushButton是繼承自QWidget的,在QWidget中有個函數(shù)setWindowOpacity,所以你會將動畫的屬性名稱設(shè)置為windowOpacity。然而,最后透明度是不會有任何改變的,因為只有在setWindowFlags時設(shè)置為Qt::Window,windowOpacity這個屬性才能生效。
因此,有必要尋求其它方法,在QWidget中有一個函數(shù)setGraphicsEffect(QGraphicsEffect *),其中QGraphicsEffect有一個派生類QGraphicsOpacityEffect,可以通過它來設(shè)置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) |
定義屬性時,在函數(shù)setBtnOpacity中改變QGraphicsOpacityEffect對象,來調(diào)整透明度。
好了,現(xiàn)在我們將動畫屬性名稱設(shè)置為buttonOpacity,就能改變按鈕的透明度了
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。