如何通过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组件的外观样式,而非修改业务逻辑层面的自定义数据结构属性。要实现你的需求,需要手动解析样式表文本,提取目标字段后更新结构体:
实现步骤
- 解析样式表文本,提取
myStruct.a和myStruct.b对应的数值与字符串 - 手动调用结构体的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
相关产品推荐
相关产品推荐

