我正在将qt 4.8与msvc 2015一起使用 我设计了一些样式表,并在后台线程中进行了昂贵的操作 当我单击该按钮以启动线程时,我注意到样式表有时会损坏 某些小部件的background-color破损,某些小部件的边框,诸如hover,qprogressbar之类的某些属性有一个奇怪的块.... 这是我的操作:
for (ULONG i = 0;i < BufferSize; ++i) {
raw_stream << "0x" << std::hex << int(Buffer[i]); // raw_stream is stringstream;
if (i+1 != BufferSize) raw_stream << ", ";
((MainWindow*)ptr)->progress_signal(i+1); // ptr is a pointer to the main class passed to the function
}
我想打印文件的十六进制,但是操作非常慢并且会破坏样式表
我不能说这是因为它在后台线程中运行所花费的时间,所以这里出了什么问题?
答案 0 :(得分:2)
Qt样式表在更多版本的Qt中得到了改进。尝试在qt.io上使用最新版本的Qt。
由于繁琐的任务阻止了应用程序事件循环,因此某些桌面管理器(例如Windows资源管理器)会阻止图形更新。因此,我建议您在单独的线程上运行密集型代码。另外,我建议不传递MainWindow
作为指向任何类的指针,因为在大多数情况下,它违反了 Domain Driven Design 的原理,我建议您使用信号和插槽。
这来自QtHelp(请参阅帮助中的QThread):
class WorkerThread : public QThread
{
Q_OBJECT
void run() override {
/*
... here is the expensive or blocking operation. It will run in paralell ...
you must emit your reportProgress signal here with the progress of the operation.
*/
emit resultReady();
}
signals:
void reportProgress(int progress);
void resultReady();
};
然后,您必须在WorkerThread
类(或您想要的类)中创建类型为QThread
(子类为MainWindow
)的对象,并连接reportProgress(int)
信号发出到更新进度的插槽中,resultReady()
将在操作完成时采取措施。最后,当您要开始操作时,调用其上的run()
函数。
注意::请记住,如果连续报告进度,则事件将累积在调用堆栈中,从而阻塞事件循环,并且您将获得与在主线程上运行密集型任务相同的结果。一种解决方法是每100毫秒或类似的时间请求进度。