我的Qt应用程序中具有以下层次结构:
QMainWindow> QWidget(centralWidget)> QWidget(子类)> QLabel

QMainWindow代码中的初始化代码:

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


在我的子类化QWidget初始化(与Qt App初始化同时发生)中,我具有以下代码:

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
}


当从类初始化添加QLabel时,该消息会很好地显示在窗口小部件中。

但是,当我按下按钮(通过同一QWidget子类中的函数)后启动相同的代码时,文本不会显示在屏幕上。

我不想使用布局,因为我需要准确定位标签。

试图重新绘制,但没有帮助

完成初始化后如何正确且动态地显示标签?

#1 楼

窗口小部件在第一次可见时会对其子对象可见,但是由于您是在以后创建窗口小部件,因此它们可能未在调用该方法,因此可能的解决方案是调用show方法。

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


评论:我觉得奇怪的是,您设置了中央小部件的QMainWindow然后创建chatWidget作为QMainWindow的父级,通常不建议将子级添加到QMainWindow中,因为它具有给定的结构,应该做的是将其放置在中央窗口内部。

评论


发布前我没有看到您的答案!无论如何,我早些时候已经评论过,但随后建议进行2次更改。

–穆罕默德·卡南(Mohammad Kanan)
18年2月4日在21:54

#2 楼

我们需要显示通过单击按钮创建的标签,因为centralwidget已经被绘制。
这是一个有效的示例,我将其添加为答案,还注意到最好将chatWidget作为子级添加到centralWidget中,其中将其添加到原始代码中UI。..这就是您的选择。 />

评论


show()就是问题!并感谢您的补充说明,这将有助于我编写更简洁的代码。

– Laurent Crivello
18年2月5日在7:12