Custom Widget is not visible in Widget window
-
I have created my own custom widget class, the code is below:
class myWidget : public QWidget { Q_OBJECT public: explicit myWidget(QWidget*parent=nullptr): QWidget(parent){} void enterEvent(QEvent *event) override { Q_UNUSED(event); qDebug()<<"Entered"; } };
In
widget.cpp
I have created it's instance, like belowmyWidget *w; Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); w=new myWidget(this); w->setStyleSheet("background-color: rgb(138, 226, 52);"); w->setGeometry(10,10,100,100); w->show(); }
As you can see my object is child of the this
widget
window but whenever I run the program it won't be visible to me in the window but when i go to top bottom i can see the console output of mine Entered, So it is present in myWidget
window but I am not able to see it even I have set the background color as green, If I just use theQt
GUI to add oneWidget
into the form and set the background color and run the code then that Widget which I added from the GUI is visible but MyWidget
which i created by my own custom widget is not visible. -
I have created my own custom widget class, the code is below:
class myWidget : public QWidget { Q_OBJECT public: explicit myWidget(QWidget*parent=nullptr): QWidget(parent){} void enterEvent(QEvent *event) override { Q_UNUSED(event); qDebug()<<"Entered"; } };
In
widget.cpp
I have created it's instance, like belowmyWidget *w; Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); w=new myWidget(this); w->setStyleSheet("background-color: rgb(138, 226, 52);"); w->setGeometry(10,10,100,100); w->show(); }
As you can see my object is child of the this
widget
window but whenever I run the program it won't be visible to me in the window but when i go to top bottom i can see the console output of mine Entered, So it is present in myWidget
window but I am not able to see it even I have set the background color as green, If I just use theQt
GUI to add oneWidget
into the form and set the background color and run the code then that Widget which I added from the GUI is visible but MyWidget
which i created by my own custom widget is not visible.@devillIsHeree
Hi
How do your paintEvent look like for myWidget?
It has to be likevoid CustomWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); }
to use a stylesheet.
-
@devillIsHeree
Hi
How do your paintEvent look like for myWidget?
It has to be likevoid CustomWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); }
to use a stylesheet.
@mrjj Thanks it works, Can you please explain the logic behind it? because if we do the same without using my own class it works but when I do the same by inheriting I have to modify the
paintEvent
as you told. -
@mrjj Thanks it works, Can you please explain the logic behind it? because if we do the same without using my own class it works but when I do the same by inheriting I have to modify the
paintEvent
as you told.@devillIsHeree
Hi
For some reason, the QWidget::paintEvent is empty so once subclassed
its not doing anything. I never really found out how come plain QWidget can
work but I guess that QStyle somehow makes it possible as long its a plain QWidget.
So when we subclass it, we have to draw using QStyle to make a stylesheet take effect. -
@mrjj Thanks it works, Can you please explain the logic behind it? because if we do the same without using my own class it works but when I do the same by inheriting I have to modify the
paintEvent
as you told.@devillIsHeree
I don't actually know the logic, it is just in the documentationIf you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
...And if you feel it a little annoying to write a paintEvent, there's a trick that I was told by @JonB :
setAttribute(Qt::WA_StyledBackground);
add this in your custom widget's constructor.