我有一个现有的多线程应用程序,我正试图将一个非常简单的QT GUI打到前端。
特别是,我尝试使用QPlainTextEdit对象实现一个非常简单的日志。每当其中一个操作系统线程启动某个操作时,我就会通过调用其appendPlainText()
方法在窗口小部件中放入一些诊断信息。
当然我的第一次破解有同步问题,所以我创建了一个包含QPlainEdit的类,用一个互斥来同步事物。基本上就是这样:
class synced_output {
public:
std::mutex mutex;
QPlainTextEdit & text;
synced_output (QPlainTextEdit * text_output) : text(*text_output) {}
void put_line (const std::string & line) {
std::lock_guard<std::mutex> lock(mutex);
text.appendPlainText(line.c_str());
}
private:
synced_output operator= (synced_output &){}
};
这似乎很好地解决了比赛状况。但是,在我以某种方式与窗口进行交互(仅点击它就足够了)之前,PlainTextEdit小部件的内容不会明显更新。如果它添加了足够的文本,我可以看到滚动条出现并移动,但在我点击之前没有文字。
根据我在网上看到的一些建议,我尝试在其中放置text.repaint()
,但这只会导致崩溃抱怨“无法将事件发送到不同线程拥有的对象”。我认为这是有道理的,但我仍然需要这样做。那么如何才能在更改后正确显示?是否有其他更好的习惯用于处理QT调用以从多个OS线程更改小部件内容?