Qt:缓慢启动时显示窗口内容
Qt: display window content on slow startup
感觉这个问题以前被问了大约一百次(例如这里),但我还没有找到有效的解决方案。。
我有一个Qt5程序(Linux),它需要一些时间(大约2秒)进行初始化。我不想生成线程(有几个原因),在初始化完成之前,程序无论如何都不可用。
当前程序启动,并显示一个黑色窗口,直到初始化完成。
我希望尽快绘制窗口内容,并队列一种完成其余部分的方法,该方法在绘制主窗口后立即执行。
这就是我尝试的:
class my_window : public QMainWindow {
Q_OBJECT
explicit my_window(QWidget *parent = 0) : QMainWindow(parent) {
initializeUI();
/// UI is ready and should be drawn. initializeRest() should
/// be queued
/// tried to repaint() or update() the MainWindow and to 'force'
/// processing outstanding events - with no effect
update();
repaint();
QApplication::processEvents();
/// don't call - just queue
QMetaObject::invokeMethod(this, "initializeRest", Qt::QueuedConnection);
}
void initializeRest() {
// do stuff which takes a while
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
但是主窗口一直保持黑色,直到执行了initializeRest()
为止。
如何告诉Qt在窗口构建完成后立即执行initializeRest()
?
我可以考虑启动一个计时器(坏的,引入额外的延迟)或一个对某种"WindowDrawn"事件做出反应的事件处理程序(坏的、复杂的)。
Qt的方法是什么?
更新:
我还尝试将initializeRest()
方法放入main()
函数中,如Murphy:所建议的那样
my_window::my_window(QWidget *parent = 0) : QMainWindow(parent) {
initializeUI();
}
int main(int a_argsc, char *a_argsv[]) {
QApplication l_application(a_argsc, a_argsv);
my_window mainWindow;
mainWindow.show();
QApplication::processEvents();
mainWindow.initializeRest();
return l_application.exec();
}
同样的结果:在initializeRest()
内等待几秒钟会显示最初的黑色主窗口,并在initializeRest()
返回后立即绘制(这对我来说似乎是合乎逻辑的,因为事件循环尚未启动。)
注意:这个建议并不能解决问题;它留在这里是为了完整。
您可以在main()
:中将启动分成更小的步骤
- 创建
QApplication
实例 - 实例化主窗口(我将在此处调用变量
mainWindow
)。在initializeUI();
之后,您可以安全地从代码示例的构造函数中删除所有重新绘制的变通方法 - 调用
mainWindow.show()
以强制显示主窗口,然后调用QApplication::processEvents()
以强制处理绘制事件 - 完成应用程序的所有其他初始化工作
- 像往常一样,通过调用
QApplication::exec()
来启动事件循环
请注意,对于复杂的应用程序/主窗口实现,按照正确的顺序做每件事可能会非常麻烦;CCD_ 14肯定是不那么乏味的解决方案。
我也有同样的问题。我认为问题不是基于show()
函数。尝试运行下一个代码。
如果在boxLayout中添加按钮,应用程序将快速启动。但是,如果我尝试setGeometry()
,应用程序需要很长时间才能启动。
相关文章:
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 在 GLFW 窗口中显示 FFMPEG 解码帧
- Gtkmm 窗口为空白,不显示任何小部件或标题
- 为什么输出窗口上没有显示输出?
- C++ 窗口显示无框图像
- 如何使用Qt在新窗口中显示视频帧
- 如何以编程方式使窗口全屏显示?
- 强制将以SW_HIDE启动的进程中的窗口显示为STARTUPINFO
- 制作垫子类型对象的数组.输出窗口显示同一帧
- Gtk::在将我的gtkmm2移植到gtkmm3应用程序时,窗口显示并退出
- OpenGL:新窗口显示当前打开的窗口的内容
- WINAPI 创建窗口显示奇怪的结果
- 为什么通过CreateProcess调用的程序的窗口显示为SW_HIDE和CREATE_NO_INDOW
- 输出窗口显示三个图像,而不是一个
- 分窗口显示一个软件,总是在最上面
- WINAPI -窗口显示在调试版本中,而不是在发布版本中
- 在Visual Studio中使用本地Windows调试器运行第一个程序。输出窗口显示大量"Cannot find or open the PDB file"
- 我们如何防止控制台窗口显示在Visual Studio下
- 更新窗口显示OpenGL/GLUT c++