You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Q_PROPERTY和样式表更新结构体的值?

问题

我在QTextEdit中编写样式表并应用到QMainWindow:

myStruct.a: 10;
myStruct.b: "hello world";

调用setStyleSheet(textEdit->toPlainText());应用样式表,但setA、getA、getMyStruct或setMyStruct这些函数均未被调用。请问通过样式表更新MyStruct值的正确方法是什么?

相关代码

struct MyStruct
{
    Q_GADGET
    int m_a;
    QString m_b;

    Q_PROPERTY(int a READ getA WRITE setA)
    Q_PROPERTY(QString b MEMBER m_b)

    void setA(int a) 
    { 
      m_a = a; 
    }
    int getA() const
    { 
        return m_a;
    }
};
Q_DECLARE_METATYPE(MyStruct)



class MainWindow : public QMainWindow
{
    Q_OBJECT
    Q_PROPERTY(MyStruct myStruct READ getMyStruct WRITE setMyStruct NOTIFY myStructChanged)
public:
    MainWindow() : QMainWindow(nullptr), ui(new Ui::MainWindow())
    {
        ui->setupUi(this);

        QVBoxLayout* layout = new QVBoxLayout();
        ui->centralWidget->setLayout(layout);

        QTextEdit* textEdit = new QTextEdit(this);
        textEdit->setText(R"(
            myStruct.a: 10;
            myStruct.b: "hello world";
        )");

        QPushButton* button = new QPushButton("update", this);
        connect(button, &QPushButton::clicked, [=] 
        { 
            setStyleSheet(textEdit->toPlainText()); 
        });

        layout->addWidget(textEdit);
        layout->addWidget(button);
    }    

    MyStruct myStruct;

    MyStruct getMyStruct() const
    {
        return myStruct;
    }

    void setMyStruct(MyStruct val)
    {
        myStruct = val;
        emit myStructChanged();
    }

    void changeEvent(QEvent* event)
    {
        if (event->type() == QEvent::StyleChange) 
        {   
            qDebug() << "style changed";
        }
    }

signals:
    void myStructChanged();

private:
    Ui::MainWindow* ui;
};
解答

Qt样式表不支持直接通过其语法更新自定义结构体类型的属性,它的核心作用是控制UI组件的外观样式,而非修改业务逻辑层面的自定义数据结构属性。要实现你的需求,需要手动解析样式表文本,提取目标字段后更新结构体:

实现步骤

  1. 解析样式表文本,提取myStruct.a和myStruct.b对应的数值与字符串
  2. 手动调用结构体的setter或直接修改成员,触发属性变更信号

修改后的示例代码

更新按钮的点击槽函数,添加解析逻辑:

connect(button, &QPushButton::clicked, [=] 
{ 
    QString styleSheet = textEdit->toPlainText();
    setStyleSheet(styleSheet); // 保留原样式表应用逻辑(若需)

    // 解析myStruct.a的值
    QRegularExpression aRegex(R"(myStruct\.a:\s*(\d+);)");
    QRegularExpressionMatch aMatch = aRegex.match(styleSheet);
    if (aMatch.hasMatch()) {
        int aVal = aMatch.captured(1).toInt();
        myStruct.setA(aVal);
        emit myStructChanged();
    }

    // 解析myStruct.b的值
    QRegularExpression bRegex(R"(myStruct\.b:\s*"([^"]+)";)");
    QRegularExpressionMatch bMatch = bRegex.match(styleSheet);
    if (bMatch.hasMatch()) {
        QString bVal = bMatch.captured(1);
        myStruct.m_b = bVal;
        emit myStructChanged();
    }
});

补充说明

  • Qt样式表仅对内置UI元素属性(如background-color、font-size等)生效,自定义结构体不在其作用范围内
  • 如果需要更灵活的配置方式,建议使用QSettings、JSON/YAML配置文件,或自定义配置语法,而非强行复用样式表语法

内容的提问来源于stack exchange,提问作者Cesar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:53:27