【发布时间】:2018-02-26 19:00:33
【问题描述】:
我有一个 QWidget,我想在另一个 QWidget 上像 Dialog 一样使用它。
我要做的是一个简单的“请稍候,yadda yadda...”对话框,没有按钮。
代码部分如下:
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 构造函数),它会正确显示其中的消息。
我感觉循环阻止了绘制操作,但小部件本身也应该丢失。为什么它只是标签让我难以理解。
感谢您的任何见解。
【问题讨论】:
-
for (int var =循环中有什么内容?您是否处理过事件? -
您从未设置小部件布局。您在布局构造函数中将 box 指定为父级,但我仍然认为您必须执行 box->setLayout(layout)。
-
@G.M.,我与事件无关,至少据我所知没有。我生成了一些
QTableWidgetItem并将它们插入到完全不同的QTableWidget中。 -
但是你的盒子对象在哪里被附加到布局上......首先解决这个问题
-
您是否尝试在循环中添加
QCoreApplication::processEvents();? (您有繁重的处理)。如果不调用processEvents,您永远不会将控制权交还给 Qt 事件循环来实际执行您请求的绘图