QLabel 不显示在 QWidget 中
QLabel does not display in QWidget
我的 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);
在我的 subclassed 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
}
当从 class 初始化添加 QLabel 时,消息会很好地显示在小部件中。
然而,当我在按下按钮后启动相同的代码时(通过同一个 QWidget 子 class 中的函数),文本不会出现在屏幕上。
我不想使用布局,因为我需要准确定位我的标签。
尝试重新粉刷,但都无济于事。
初始化完成后如何正确动态显示标签?
小部件在第一次可见时调用对其子项可见,但由于您是在之后创建它,因此它们可能不会调用该方法,一个可能的解决方案是调用 show 方法。
void ChatWidget::displayChatAfterButtonPressed()
{
QLabel *lbl;
lbl=new QLabel(this);
lbl->setText("Hello World 2");
lbl->show();
}
评论:我觉得QMainWindow你设置一个central widget然后创建chatWidget作为QMainWindow的parent,一般不建议添加children到 QMainWindow 因为它有一个给定的结构,应该做的是把它放在 centralwidget 里面。
我们需要显示按钮点击创建的标签,因为 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(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();
}
我的 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);
在我的 subclassed 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
}
当从 class 初始化添加 QLabel 时,消息会很好地显示在小部件中。
然而,当我在按下按钮后启动相同的代码时(通过同一个 QWidget 子 class 中的函数),文本不会出现在屏幕上。
我不想使用布局,因为我需要准确定位我的标签。
尝试重新粉刷,但都无济于事。
初始化完成后如何正确动态显示标签?
小部件在第一次可见时调用对其子项可见,但由于您是在之后创建它,因此它们可能不会调用该方法,一个可能的解决方案是调用 show 方法。
void ChatWidget::displayChatAfterButtonPressed()
{
QLabel *lbl;
lbl=new QLabel(this);
lbl->setText("Hello World 2");
lbl->show();
}
评论:我觉得QMainWindow你设置一个central widget然后创建chatWidget作为QMainWindow的parent,一般不建议添加children到 QMainWindow 因为它有一个给定的结构,应该做的是把它放在 centralwidget 里面。
我们需要显示按钮点击创建的标签,因为 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(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();
}