Qt中的属性设置(搜集整理)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt中的属性设置(搜集整理)相关的知识,希望对你有一定的参考价值。

一、Qt中的属性

属性是指窗口或控件的属性,比如opacity属性表示“透明度”,geometry指的是“位置和大小”,pos属性代表“位置”。qt中的控件有自带的属性,我们也可以自己定义属性。

QObject这个类有一个函数setProperty,我们可以通过这个函数定义自己的属性,使用方法很简单,setProperty(const char * name, const QVariant & value),第一个参数是属性的名称,第二个参数是属性值。

除了上面的方法,还有一种自定义属性的方法,就是使用Q_PROPERTY这个宏,简单用法如下:

Q_PROPERTY(type name READ getFunction WRITE setFunction)

Q_PROPERTY(参数类型 参数名称 READ 获得属性值函数 WRITE 设置属性值函数)

比如Q_PROPERTY(bool bIsDoubi READ getDoubi WRITE setDoubi),属性类型是bool类型,bIsDoubi是属性名称。除此之外还需要写两个函数,第一个是设置属性的函数void setDoui(bool),第二个是获得属性的函数bool getDoubi()。

二、自定义属性有什么用

我目前所知的自定义属性有两个用途,第一是用于改变样式,第二是用于动画,下面分别作解释。

三、改变样式

翻开Qt助手,找到样式表语法部分,在通过选择器设置样式中有一个属性选择器,比如QPushButton[flat="false"]意思就是当按钮属性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;}

上面的样式意思是,按钮默认样式是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两个函数实现。

四、动画中使用自定义属性

如果我们想要用一个动画改变按钮的透明度,因为按钮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,就能改变按钮的透明度了


以上是关于Qt中的属性设置(搜集整理)的主要内容,如果未能解决你的问题,请参考以下文章

26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段

将多个输出中的hls属性设置为单独的片段代码

小程序各种功能代码片段整理---持续更新

Qt Canvas3D 代码中为各种对象设置的那些字符串“名称”属性是啥?

关于行类元素与块级元素的一些搜集整理

如何在 Qt 中为场景中的对象设置属性