QMainWindow->setStyleSheet behaves unexpected (Q_OBJECT causing problems?)
-
Using Qt 4.8.4 on Windows 7 (MSVC 2010) I have a standard QMainWindow in my app with toolbar and menu. I want to achieve that toolbar and menu keep their grey color, but the central widget should have a white background. My test case is an app with just one label in the central widget. In order to see the problem, add or remove the Q_OBJECT line in test.h
When Q_OBJECT is there, only the label gets a white bg. If Q_OBJECT is commented out, the whole central widget is white. Of course, I want the whole area white, but also need Q_OBJECT.
Here's the files:
main.cpp:
@#include "test.h"class testwin : public QMainWindow {
public:
QWidget *centralWidget;
QToolBar *mainToolBar;testwin(QWidget *parent = 0) : QMainWindow(parent) { centralWidget = new test(this); setCentralWidget(centralWidget); mainToolBar = new QToolBar(this); this->addToolBar(Qt::TopToolBarArea, mainToolBar); }; ~testwin() {};
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
testwin w;
w.centralWidget->setStyleSheet("background-color: white;");
w.show();
return a.exec();
}
@test.h:
@#ifndef TEST_H
#define TEST_H#include <QtGui>
class test : public QWidget
{
Q_OBJECT // remove thispublic:
QLabel *label;test(QWidget *parent = 0) { resize(400, 300); label = new QLabel(this); label->setText("Test"); };
};
#endif // TEST_H
@ -
Hi,
Could you try with the latest Qt ? 4.8.5 in the 4 series, maybe even with Qt 5 to see if the behavior is the same.
-
This can be reproduced in Qt5.1
-
Hi,
From the documentation of Qt stylesheet, we can find the answer of the problem:
If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
@
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
@Warning: Make sure you define the Q_OBJECT macro for your custom widget.