Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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 below

    myWidget *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 thiswidgetwindow 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 my Widget window but I am not able to see it even I have set the background color as green, If I just use the Qt GUI to add one Widget 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.


  • Lifetime Qt Champion

    @devillIsHeree
    Hi
    How do your paintEvent look like for myWidget?
    It has to be like

     void 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.


  • Lifetime Qt Champion

    @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.



  • @devillIsHeree
    I don't actually know the logic, it is just in the documentation

    If 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.


Log in to reply