属性是指窗口或控件的属性,好比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
我目前所知的自定义属性有两个用途,第一是用于改变样式,第二是用于动画,下面分别做解释。spa
翻开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部分。
若是咱们想要用一个动画改变按钮的透明度,由于按钮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,就能改变按钮的透明度了