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();
};
那么你必须在你的MainWindow
class(或class 你想要的)并将发出的 reportProgress(int)
信号连接到你更新进度的插槽,并且 resultReady()
在操作完成时采取行动。最后,当你想开始你的操作时,在它上面调用 run()
函数。
注意: 请记住,如果您连续报告进度,事件将在调用堆栈中累积并阻塞事件循环,您将得到与 运行 相同的结果在主线程上执行您的密集任务。解决方法可能是每 100 毫秒或类似时间请求一次进度。
我在 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();
};
那么你必须在你的MainWindow
class(或class 你想要的)并将发出的 reportProgress(int)
信号连接到你更新进度的插槽,并且 resultReady()
在操作完成时采取行动。最后,当你想开始你的操作时,在它上面调用 run()
函数。
注意: 请记住,如果您连续报告进度,事件将在调用堆栈中累积并阻塞事件循环,您将得到与 运行 相同的结果在主线程上执行您的密集任务。解决方法可能是每 100 毫秒或类似时间请求一次进度。