QLabel不能在QWidget中显示。

3
我可以帮您翻译成中文。以下是需要翻译的内容:

我在Qt应用程序中有以下层次结构: QMainWindow > QWidget(中心窗口)> QWidget(子类化)> QLabel

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

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

在我的子类QWidget初始化中(与Qt应用程序初始化同时进行),我有以下代码:

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子类的函数中通过按钮按下启动相同的代码时,则不会在屏幕上显示文本。

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

尝试重新绘制,但也没有帮助。

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

2个回答

6

当小部件第一次可见时,它们会要求它们的子级可见,但由于您随后创建了它们,它们可能不会调用该方法,一个可能的解决方案是调用show方法。

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

注释: 我觉得很奇怪,你设置了一个中央小部件(QMainWindow),然后将chatWidget作为QMainWindow的父级创建,通常不建议将子项添加到QMainWindow中,因为它有给定的结构,应该将其放置在centralwidget内。


我在发布之前没有看到你的回答!无论如何,我早些时候已经发表了评论,但后来意识到有两个建议的更改。 - Mohammad Kanan

1
我们需要在按钮点击后显示标签,因为centralwidget已经被绘制。 这是一个可行的示例,我将其添加为答案,同时我注意到最好将chatWidget作为子项添加到centralWidget中,在您原始代码中它被添加到UI中.. 这是您的选择。

主窗口:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //
    ui->setupUi(this);
    centralWidget = new QWidget();
    centralWidget->setGeometry(width,height);
    chatWidget=new ChatWidget(centralWidget); // the subclassed QWidget
    setCentralWidget(centralWidget);

    // added testing
    QPushButton *btn = new QPushButton("MyButton",centralWidget);
    btn->setGeometry(100,100,100,100);
    btn->setMaximumSize(100,100);
    connect(btn,&QPushButton::clicked, chatWidget, &ChatWidget::displayChatAfterButtonPressed);
 }

和 chatWidget:

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

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

1
show() 是问题所在!感谢额外的解释,这将帮助我编写更清晰的代码。 - Laurent Crivello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接