- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个问题,在 Linux 上使用 Xorg (Ubuntu 14.04) 和 Qt 5.5.1 QSplashScreen
在我进入事件循环之前不会被绘制。即使我多次调用 QApplication::processEvents()
,它仍然没有被绘制,即使在 1000 次调用之后,尽管窗口已经在屏幕上,保留了之前的原始像素应用启动,因此实际上是不可见的*。来自 this answer我想到了使用调用 QApplication::processEvents()
的 timed 循环,如下所示:
#include <QThread>
#include <QApplication>
#include <QSplashScreen>
int main(int argc, char** argv)
{
QApplication a(argc,argv);
QSplashScreen splash;
splash.show();
splash.showMessage("Loading...");
// The hack to try to ensure that splash screen is repainted
for(int i=0;i<30;++i)
{
QThread::usleep(1e3);
a.processEvents();
}
QThread::usleep(5e6); // simulate slow loading process
splash.showMessage("Finished");
return a.exec();
}
上面的代码主动休眠了 30 毫秒,试图让 QSplashScreen
重绘。这对我有用,但我不确定它是否总是有效,例如在繁忙/缓慢的 CPU 或任何其他条件下(根据经验发现 30 次迭代的神奇值)。
另一种通常非常具有侵入性的方法是在另一个线程中完成所有必要的加载,只是为了确保主线程中的 QSplashScreen
确实有一个事件的消息队列。由于需要大量重做主程序,这看起来不是一个很好的解决方案。
那么,有什么方法可以确保QSplashScreen
已经重绘,使其窗口不包含垃圾,然后才继续进行长时间的阻塞加载过程?
* 当我在闪屏后面移动一个窗口时发现了这一点
最佳答案
避免不可知的先验魔术超时的一种方法是等待一个确切的事件:绘画事件。在 X11 上它似乎有延迟。要进行这种等待,我们必须子类化 QSplashScreen
并覆盖 QSplashScreen::paintEvent()
,如下所示:
#include <QThread>
#include <QApplication>
#include <QSplashScreen>
class MySplashScreen : public QSplashScreen
{
bool painted=false;
void paintEvent(QPaintEvent* e) override
{
QSplashScreen::paintEvent(e);
painted=true;
}
public:
void ensureFirstPaint() const
{
while(!painted)
{
QThread::usleep(1e3);
qApp->processEvents();
}
}
};
int main(int argc, char** argv)
{
QApplication a(argc,argv);
MySplashScreen splash;
splash.show();
splash.showMessage("Loading...");
splash.ensureFirstPaint();
QThread::usleep(5e6); // simulate slow loading process
splash.showMessage("Finished");
return a.exec();
}
关于c++ - 有什么方法可以真正确保 QSplashScreen 已在屏幕上重新绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50059520/
我刚刚在 PyQt 应用程序中编写了启动屏幕代码,以便在启动前显示图像。我用过QSplashscreen。问题是图像每 20 次显示一次。在其他情况下,会显示一个灰色矩形。两种情况截图: 有效:htt
所以我预期的程序流程是这样的: 创建 show() QSplashScreen 实例。 初始化系统的其他部分,包括i18n模块 将(翻译的)版权声明 (QLabel) 添加到 QSplashScree
我在 QMainWindow 的构造函数中创建了一个 QSplashScreen: MainApp::MainApp() : QMainWindow(), splashScreen(new Q
我有一个问题,在 Linux 上使用 Xorg (Ubuntu 14.04) 和 Qt 5.5.1 QSplashScreen 在我进入事件循环之前不会被绘制。即使我多次调用 QApplication
我想将 QSplashScreen 添加到 PyQT4 应用程序。它在 Python 中运行良好,但是当我用 py2exe 创建 exe 时,启动图像是不可见的,应用程序等待 2 秒并显示主窗口。怎么
我有一个简单的初始屏幕扩展,它应该在用户等待主窗口时显示一点动画(动画 gif)。问题是,只显示第一帧而不是全部: class SplashScreen : public QSplashScreen
谷歌虽然我尝试过,但我似乎无法弄清楚如何摆脱我正在为 QSplashScreen 服务的 png 周围的白色边框。 我看过 this article ,但我不知道如何将其转换为 PyQt,或者这是否是
我在新的 Qt Quick 2 项目上使用 QSplashScreen 时遇到问题。这是项目“main.cpp”: int main(int argc, char *argv[]) { QGu
我在新的 Qt Quick 2 项目上使用 QSplashScreen 时遇到问题。这是项目“main.cpp”: int main(int argc, char *argv[]) { QGu
PyQT4.11 Python 2.7 我一直在尝试创建一个启动屏幕,以在选择特定选项卡时显示加载消息。当调用 app.processEvents() 时,我会显示一个灰色框而不是图像,但是如果我在调
我通过子类化 QSplashScreen 将 QProgressBar 放入 QSplashScreen 中。它覆盖了 drawContents() 方法。 我以为我已经正确设置了几何图形,但它同时呈
我是一名优秀的程序员,十分优秀!