【发布时间】:2020-07-09 02:55:12
【问题描述】:
我正在尝试将一个对象(继承自 QWidget)作为子对象添加到另一个 QWidget,如下所示,它与另一个普通的 QWidget 实例完美配合,但不适用于我的自定义类,任何想法为什么?
fenetre.h
#ifndef FENETRE_H
#define FENETRE_H
#include <QWidget>
#include <QMouseEvent>
class Fenetre : public QWidget
{
Q_OBJECT
public:
Fenetre();
};
#endif // FENETRE_H
fenetre.cpp
#include "fenetre.h"
Fenetre::Fenetre() : QWidget()
{
}
main.cpp
#include <iostream>
#include <QApplication>
#include <QWidget>
#include "fenetre.h"
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QWidget window;
window.setFixedSize(800,600);
//This appears
QWidget rec1;
rec1.setParent(&window);
rec1.setFixedSize(100,100);
rec1.move(400,200);
rec1.setStyleSheet("background-color: red");
//This one not
Fenetre rec2;
rec2.setParent(&window);
rec2.setFixedSize(100,100);
rec2.move(200,200);
rec2.setStyleSheet("background-color: green");
window.show();
return app.exec();
}
PS:我在平台上进行了研究,但大多数答案都提到了布局的使用。谢谢!
【问题讨论】:
-
我尝试使用 Windows10/VS2017/Qt5.13 以及 cygwin/g++/Qt5.9 重现您的 MCVE。在这两种情况下,我都得到了红色和绿色的盒子。我所做的唯一更改:从
class fenetre中排除Q_OBJECT(因为我无法正确参与moc 并且没有任何经验)。在这个 MCVE 中,Q_OBJECT可能相当无用 - 不确定它是否对您的问题起作用...... -
@Scheff 谢谢,问题是
setStyleSheet()函数,我必须在我的自定义类中实现paintEvent函数才能使其工作。 -
你在
fenetre::paintEvent()做什么?它应该继承自QWidget(),不是吗?就我而言,它在没有paintEvent()的情况下工作。我只是复制/粘贴了您的代码,我唯一做的就是将Q_OBJECT更改为//Q_OBJECT。难道为class fenetre引入新的元类型会产生这样的后果吗? -
根据这个wiki,我们需要给自定义的widget提供一个
paintEvent -
这个 wiki 提到了 Symbian OS。我不需要
paintEvent()。 (我发誓。);-) 你在什么操作系统上运行了测试?