[英]QWidget not displaying the QLabel
我有一个QWidget,要像另一个QWidget上的Dialog一样使用。
我正在尝试做的是一个简单的“请稍等,请稍等...”对话框,没有按钮。
代码部分如下:
void NewWindow::on_combobox_New_currentIndexChanged(int index) //slot function
{
QWidget* box = new QWidget();
box->setWindowModality(Qt::ApplicationModal);
box->setWindowTitle("Wait...");
QHBoxLayout* layout = new QHBoxLayout();
box->setLayout(layout);
QLabel* lbl = new QLabel();
lbl->setText("Loading...");
layout->addWidget(lbl);
box->show();
for (int var = 0; var < st.size(); ++var)
{
//Some heavy lifting here
}
box->close();
}
通常,我希望此对话框显示正确的文本,并在循环结束后消失。 实际上,它也可以这样做,但有一个区别:标签不显示。 小部件看起来是空的。 然后消失。
如果我将代码复制到其他区域(例如复制到MainWindow构造函数),它将正确显示并带有消息。
我感觉到循环阻止了绘制操作,但是小部件本身也应该丢失。 为什么只有标签让我难以理解。
感谢您的见解。
由于您是在QObject插槽中创建并显示此窗口小部件,然后在从插槽返回之前关闭该窗口小部件,因此在Qt执行所有指令的过程中,最后一个窗口close
,因此窗口小部件消失了从视图。
在您的广告位下方,Qt正在事件循环中运行。 由于控制永远不会返回到事件循环,因此Qt永远不会有机会呈现您要求的图形。
当您创建窗口小部件,添加标签等时,实际上是在事件循环中注册了一堆命令,稍后将对其进行处理。
如果您希望Qt渲染您在插槽中所做的任何更改,则在返回事件循环之前,必须调用processEvents
。
如果不这样做,您将看不到这些更改, 直到控制权传递回Qt事件循环为止 。
因此,这里发生的是,由于您还要在插槽末端关闭窗口小部件,因此Qt将创建窗口小部件,渲染其内容,然后立即将其关闭,您将看不到任何东西。
这样做的原因是,Qt可以对可见的内容,不可见的内容进行计算,对呈现的内容等保持精明,仅决定绘制必要的内容。
如果它只是立即呈现所有内容,而无需等待控制权返回到它,以便它可以处理“下一批更新”,则效率可能极低。
因此,您需要将processEvents
放入回调插槽中。
void NewWindow::on_combobox_New_currentIndexChanged(int index) //slot function
{
QWidget* box = new QWidget();
box->setWindowModality(Qt::ApplicationModal);
box->setWindowTitle("Wait...");
QHBoxLayout* layout = new QHBoxLayout();
box->setLayout(layout);
QLabel* lbl = new QLabel();
lbl->setText("Loading...");
layout->addWidget(lbl);
box->show();
QCoreApplication::processEvents(); // cause the box to be displayed
for (int var = 0; var < st.size(); ++var)
{
//Some heavy lifting here
// if you do anything here to change the widget, such as
// updating a progress bar, you need to `processEvents` again
QCoreApplication::processEvents();
}
box->close();
}
至于为什么显示窗口小部件窗口而不显示内容的原因,这很可能是因为在创建窗口小部件时Qt将消息发送到窗口管理器(在本例中为MS Windows),该窗口管理器将创建一个窗口,Qt可以在该窗口上呈现其内容。
因此,您会看到Windows为Qt创建一个新窗口的结果,但是在该窗口本身上进行Qt绘制不会产生任何结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.