Qt之动态属性unpolish()和polish()
Qt的动态属性unpolish()和polish()
1. Qt中的属性
属性是指窗⼝或控件的属性,⽐如opacity属性表⽰“透明度”,geometry指的是“位置和⼤⼩”,pos属性代表“位置”。qt中的控件有⾃带的属性,我们也可以⾃⼰定义属性。QObject这个类有⼀个函数tProperty,我们可以通过这个函数定义⾃⼰的属性,使⽤⽅法很简单,tProperty(const
党员除名char * name, const QVariant &
value),第⼀个参数是属性的名称,第⼆个参数是属性值。除了上⾯的⽅法,还有⼀种⾃定义属性的⽅法,就是在⼀个继承⾃QObject 的类中使⽤ Q_PROPERTY 宏指令,简单⽤法如下:
Q_PROPERTY(bool focus READ hasFocus)
Q_PROPERTY(bool enabled READ isEnabled WRITE tEnabled)
牛仔衣服
Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
Q_PROPERTY(参数类型 参数名称 READ 获得属性值函数 WRITE 设置属性值函数)
⽐如Q_PROPERTY(bool bIsDoubi READ getDoubi WRITE tDoubi );
其中,属性类型是bool类型,bIsDoubi是属性名称。除此之外还需要写两个函数,第⼀个是设置属性的函数void
tDoui(bool),第⼆个是获得属性的函数bool getDoubi()。
2. ⾃定义属性有什么作⽤
油渍怎么洗掉
⽬前所知的⾃定义属性有两个⽤途,第⼀是⽤于改变样式,第⼆是⽤于动画,下⾯分别作解释:
1)改变样式
翻开Qt助⼿,找到样式表语法部分,在通过选择器设置样式中有⼀个属性选择器,⽐如QPushButton[flat=“fal”]意思就是当按钮属性flat为fal时的样式。
举个栗⼦,我们有个QWidget类,名字叫PropertyTest,界⾯中有⼀个按钮叫pushButton
#pushButton{border:4px solid blue;}
网游情侣名
PropertyTest[borderColor="red"] #pushButton{border:4px solid red;}
PropertyTest[borderColor="green"] #pushButton{border:4px solid green;}
PropertyTest[borderColor="blue"] #pushButton{border:4px solid blue;}
按钮默认样式是blue蓝⾊,通过改变类PropertyTest的属性borderColor值改变按钮的颜⾊。
在代码中,⾸先定义属性
Q_PROPERTY(QString borderColor READ getBorderColor WRITE tBorderColor)
使⽤⼀个成员变量保存属性的值,并通过t和get函数分别设置和获得该值。
private:
QString m_strBorderColor;哪种蜂蜜好
private:
void tBorderColor(const QString &strBorderColor){ m_strBorderColor = strBorderColor; }
QString getBorderColor(){ return m_strBorderColor; }
单击按钮pushButton改变属性值,从⽽改变按钮pushButton的样式。
void PropertyTest::changeBorderColor()
{
if (m_iTest % 3 == 0)橄榄油作用
{
tBorderColor("red");
}
el if (m_iTest % 3 == 1)
{
tBorderColor("green");
}
el
{
tBorderColor("blue");
}
style()->unpolish(ui.pushButton_3);
style()->polish(ui.pushButton_3);
update();
m_iTest++;
}
最后要注意的是,上⾯代码中的unpolish和polish部分。
在Qt⽂档中有个提醒,在使⽤属性选择器时,如果之前控件有其它样式,那么需要重写设置⼀下,“旧的不去,新的不来”,通过unpolish和polish抹去旧的样式,涂上新的样式。
2)动画中使⽤⾃定义属性
如果我们想通过动画使⼀个按钮逐渐变透明,思路会是这样:按钮QPushButton继承⾃QWidget,在QWidget中有个函数
tWindowOpacity,所以只需使⽤动画类QPropertyAnimation,属性那个参数设置为windowOpacity。
然⽽,实际中,按钮透明度不会有任何改变,继续查看⽂档才知道——只有调⽤tWindowFlags函数,将窗⼝属性设置为
Qt::Window,windowOpacity这个属性才能⽣效。但是这样做pushbutton就不是正常的widget了。
因此,有必要寻求其它⽅法,在QWidget中有⼀个函数tGraphicsEffect(QGraphicsEffect *),其中QGraphicsEffect有⼀个派⽣类QGraphicsOpacityEffect,可以通过它来设置QWidget的透明度
国家栋梁m_pOpacityEffect = new QGraphicsOpacityEffect(this);
m_pOpacityEffect->tOpacity(1);
this->tGraphicsEffect(m_pOpacityEffect);
海子自杀
Q_PROPERTY(qreal buttonOpacity READ buttonOpacity WRITE tBtnOpacity)
上⾯的写法可能不太好,因为qreal精度与机器有关,最好⽤double或float。
定义属性时,在函数tBtnOpacity中改变QGraphicsOpacityEffect对象,来调整透明度。
好了,现在我们将动画属性名称设置为buttonOpacity—— QPropertyAnimation::tPropertyName(“buttonOpacity”) ,就能通过动画改变按钮的透明度了。