QLabel 不显示在 QWidget 中

Lau*_*llo 3 qt qwidget qlabel

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

我的 QMainWindow 代码中的初始化代码:

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

在我的子类 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

试图重新粉刷,但也无济于事。

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

eyl*_*esc 5

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

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

评论:我觉得奇怪的是 QMainWindow 你设置了一个中央小部件,然后创建 chatWidget 作为 QMainWindow 的父级,一般不建议在 QMainWindow 中添加子级,因为它有给定的结构,应该做的是将其放置在 centralwidget 中。