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

qt doing expensive operations breaks the stylesheet

我在 msvc 2015 中使用 qt 4.8 我设计了一些样式表并在后台线程中进行了昂贵的操作 当我单击按钮启动线程时,我注意到样式表有时会被破坏 background-color 打破了一些小部件,边框在一些小部件,一些属性,如悬停,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
}

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

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

Qt 样式表在更多的 Qt 版本中得到了改进。在 qt.io.
尝试使用最新版本的 Qt 由于密集型任务会阻塞应用程序事件循环,因此 Windows Explorer 等一些桌面管理器会阻塞图形更新。因此,我建议您 运行 在单独的线程上执行密集型代码。我还建议 不要MainWindow 作为指向任何 class 的指针传递,因为它违反了 域驱动设计 的原则在大多数情况下,我建议您使用信号和槽。
这是来自 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();
};

那么你必须在你的MainWindowclass(或class 你想要的)并将发出的 reportProgress(int) 信号连接到你更新进度的插槽,并且 resultReady() 在操作完成时采取行动。最后,当你想开始你的操作时,在它上面调用 run() 函数。

注意: 请记住,如果您连续报告进度,事件将在调用堆栈中累积并阻塞事件循环,您将得到与 运行 相同的结果在主线程上执行您的密集任务。解决方法可能是每 100 毫秒或类似时间请求一次进度。