Search code examples
qtqwidgetqlabel

QLabel does not display in QWidget


I have the following hierarchy in my Qt Application: QMainWindow > QWidget (centralWidget) > QWidget (subclassed) > QLabel

Initialization code in my QMainWindow code:

centralWidget = new QWidget();
centralWidget->setGeometry(0,0,width,height);
chatWidget=new ChatWidget(this); // the subclassed QWidget
setCentralWidget(centralWidget);

In my subclassed QWidget initialization (which happens at the same time than the Qt App initialization) I have the following code:

ChatWidget::ChatWidget(QWidget *parent):QWidget(parent)
{
    QLabel  *lbl;
    lbl=new QLabel(this);
    lbl->setText("Hello World 1"); <-- Is properly Display
}

void ChatWidget::displayChatAfterButtonPressed()
{
    QLabel *lbl;
    lbl=new QLabel(this);
    lbl->setText("Hello World 2"); <-- Does NOT appear
}

When the QLabel is added from the class initialization then the message is well displayed in the widget.

However when I launch the same code after a button pressed (via a function in the same QWidget subclass), then the text does not appear on screen.

I don't want to use layouts as I need to exactly position my labels.

Tried to repaint, but didn't help neither.

How can I properly and dynamically display a label after the initialization is done ?


Solution

  • Widgets when they are visible for the first time call to be visible to their children, but since you are creating it afterwards they probably are not calling that method, a possible solution is to call the show method.

    void ChatWidget::displayChatAfterButtonPressed()
    {
        QLabel *lbl;
        lbl=new QLabel(this);
        lbl->setText("Hello World 2");
        lbl->show();
    }
    

    comment: it seems strange to me that the QMainWindow you set a central widget and then create the chatWidget as a parent to the QMainWindow, it is generally not recommended to add children to the QMainWindow because it has a given structure, what should be done is to place it inside the centralwidget.