Qt之QSS(Q_PROPERTY-原始属性)-阿里云开发者社区

开发者社区> 开发与运维> 正文

Qt之QSS(Q_PROPERTY-原始属性)

简介: 简述 在Qt之QSS(样式表语法)一节讲过关于“设置对象属性”的用法,里面有一条很重要的原则是:任何可被识别的Q_PROPERTY都可以使用qproperty-语法设置。 这里需要对Qt属性系统有一定的了解,详见:Qt之属性系统。 简述 属性 实例 效果 QSS 源码 更多参考 属性 下面我们以QLabel为例,讲解如何在QSS中使用属性。

简述

Qt之QSS(样式表语法)一节讲过关于“设置对象属性”的用法,里面有一条很重要的原则是:任何可被识别的Q_PROPERTY都可以使用qproperty-语法设置。

这里需要对Qt属性系统有一定的了解,详见:Qt之属性系统

属性

下面我们以QLabel为例,讲解如何在QSS中使用属性。

class Q_WIDGETS_EXPORT QLabel : public QFrame
{
    ...
    Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap)
    Q_PROPERTY(bool scaledContents READ hasScaledContents WRITE setScaledContents)
    ...
};

可以看到,其中pixmap、scaledContents等属性均可使用,这样我们就可以通过QSS按照qproperty-<property name>语法的方式设置标签的图标和适应性了。

但是如果要设置标签的大小该怎么办呢?因为我们并没有发现与width、height、size相关的属性。难道真的束手无策?当然不是了,我们可以继续向上级联查找基类,这样,可以很容易的发现QWidget中有需要的属性:

class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice
{
    ...
    Q_PROPERTY(QSize minimumSize READ minimumSize WRITE setMinimumSize)
    Q_PROPERTY(QSize maximumSize READ maximumSize WRITE setMaximumSize)
    ...
};

实例

通过以上的分析,我们可以很快的用QSS构建属于自己的样式了。

效果

这里写图片描述

QSS

下面,主要介绍qproperty-<property name>语法,其它样式可以忽略。

QLabel#customLabel {
        qproperty-minimumSize: 100px 100px;
        qproperty-maximumSize: 100px 100px;
        qproperty-pixmap: url(:/Images/logo);
        qproperty-scaledContents: true;
}

QPushButton#customButton {
        qproperty-text: "Click Me";
        qproperty-icon: url(:/Images/logo);
        qproperty-iconSize: 20px 20px;
}

QGroupBox#customGroupBox {
        qproperty-title: "GroupBox";
}

源码

我们不需要通过C++代码调用任何接口,仅仅通过上面的样式就可以实现自定义风格了。

QLabel *pLabel = new QLabel(this);
QPushButton *pButton = new QPushButton(this);
QGroupBox *pGroupBox = new QGroupBox(this);

pLabel->setObjectName("customLabel");
pButton->setObjectName("customButton");
pGroupBox->setObjectName("customGroupBox");

QVBoxLayout *pLayout = new QVBoxLayout();
pLayout->addStretch();
pLayout->addWidget(pLabel, 0, Qt::AlignCenter);
pLayout->addWidget(pButton);
pLayout->addStretch();
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10);

pGroupBox->setLayout(pLayout);

如果按照下面这种方式写,其结果是相同的:

...
pLabel->setPixmap(QPixmap(":/Images/logo"));
pLabel->setMinimumSize(100, 100);
pLabel->setMaximumSize(100, 100);
pLabel->setScaledContents(true);

pButton->setIcon(QIcon(":/Images/logo"));
pButton->setIconSize(QSize(20, 20));
pButton->setText("Click Me");

pGroupBox->setTitle("GroupBox");
...

到这里,是不是越觉得QSS有意思了。。。O(∩_∩)O~

更多参考

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章