gpt4 book ai didi

c++ - Qt Q_OBJECT 宏导致样式表出现意外行为

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:38 30 4
gpt4 key购买 nike

我编写了一个扩展 QWidget 类的自定义 Qt 小部件。

让我们考虑以下代码:

.h

#ifndef SS_TEST_H
#define SS_TEST_H

#include <QMainWindow>

class TestWidget : public QWidget
{
Q_OBJECT // ***>>> BUG HERE <<<***

public:
TestWidget(const QString & v1, const QString & v2, QWidget * parent = nullptr);
};

class TestWindow : public QMainWindow
{
Q_OBJECT

public:
TestWindow();
};

#endif // SS_TEST_H

.cpp

#include "ss_test.h"

#include <QGridLayout>
#include <QLabel>
#include <QApplication>

TestWidget::TestWidget(const QString & v1, const QString & v2, QWidget * parent) : QWidget(parent)
{
QGridLayout * lay = new QGridLayout;

QLabel * field = new QLabel(v1, this);
QLabel * value = new QLabel(v2, this);
value->setMinimumWidth(80);
value->setAlignment(Qt::AlignCenter);
value->setStyleSheet("QLabel { background-color: white; border: 1px solid silver; }");

lay->addWidget(field, 0, 0);
lay->addWidget(value, 0, 1);

this->setLayout(lay);

this->setStyleSheet("QWidget { background-color: red; }");
}

TestWindow::TestWindow()
{
setWindowTitle("ss test");
resize(400, 300);

QWidget * cw = new QWidget;
QVBoxLayout * cl = new QVBoxLayout;

TestWidget * tw1 = new TestWidget("Field 1", "Value 1", this);
TestWidget * tw2 = new TestWidget("Field 2", "Value 2", this);

cl->addWidget(tw1);
cl->addWidget(tw2);
cl->addStretch();

cw->setLayout(cl);
this->setCentralWidget(cw);
}

int main(int argc, char ** argv)
{
QApplication app(argc, argv);

TestWindow tw;
tw.show();

return app.exec();
}

我所说的小部件是 TestWidget 类。

在类声明中没有 Q_OBJECT 宏,我得到了我想要的样式: enter image description here

但是如果我在类声明的开头添加Q_OBJECT 宏(正如您在头文件中看到的注释),它意外地修改了小部件的样式: enter image description here

我不明白这里发生了什么。

当然,在我的真实项目中,小部件比这个最小示例中的小部件更加精细,并且必然需要 Q_OBJECT 宏(以便使用信号/插槽机制和 qobject_cast).

如果有人能向我解释 Q_OBJECT 在这里做什么以及为什么,我将不胜感激。

最佳答案

必须非常仔细地阅读文档才能找到正确的 passage .

您的 TestWidget 类需要重新实现 paintEvent:

void TestWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

还有一个重要提示,您必须定义 Q_OBJECT 宏。

Warning: Make sure you define the Q_OBJECT macro for your custom widget.

我试过了,行为似乎符合您的需要。

对于缺少 Q_OBJECT 的奇怪行为的可能解释可能是 qobject_cast<TestWidget*>(widget)会产生 nullptr .这可能会导致呈现的样式表出现不同的行为。

关于c++ - Qt Q_OBJECT 宏导致样式表出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56975868/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com