Qt执行昂贵的操作会破坏样式表

时间:2018-07-19 03:52:24

标签: c++ qt qtstylesheets

我正在将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
}

我想打印文件的十六进制,但是操作非常慢并且会破坏样式表

我不能说这是因为它在后台线程中运行所花费的时间,所以这里出了什么问题?

1 个答案:

答案 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毫秒或类似的时间请求进度。