我有这个错误充斥我的终端并使其无法调试。有没有办法让这个警告沉默?仅当我在TableWidget上包含scrollToBottom()时才会生成此错误。
答案 0 :(得分:9)
您不想取消该警告,因为它不是警告。这是一个错误。 Qt在这里太客气了。它应该是一个硬判断,因为它的存在表明你编写代码的方式可能会破坏GUI对象的数据并继续超过这一点是一个愚蠢的差事。
不要永远直接从其他线程调用GUI方法 ,除非这些方法明确记录为线程安全。
如果需要进行跨线程调用,请使用间接,线程安全的方法:QMetaObject::invokeMethod
用于QObject
上的插槽和可调用方法,或使用代理{{1} }。如果你正在从另一个线程进行映像更新,那么使用signal-slot或metacall机制在线程之间传递QObject
实例是完全正常的。
有一个非常简单的测试标准:如果QImage
- 派生类的方法不记录为线程安全的,那么你应该能够安全地断言该对象是驻留在当前主题中:
QObject
无关紧要该方法似乎“无害”。 Q_ASSERT(widget->thread() == QThread::currentThread());
widget->scrollToBottom();
会造成那么多麻烦吗?是。或者它不能。即使它没有在特定的情况下,你仍然依赖于Qt的实现细节保持不变。您是否真的希望审核Qt代码以确定它是否安全?不。您的代码有错误。修理它。就是这样。
答案 1 :(得分:0)
您应该更好地设计代码以避免显示此消息。如果你在另一个线程中创建了pixmap并在GUI线程中“使用”它,这可能现在,明天或永远......或者不会。不要那样做。
如果不更改Qt源或安装消息处理程序,则无法抑制此警告的输出。
答案 2 :(得分:0)
如果您的某些实际代码可用,那会好得多。
您看到这个的原因是您使用的是与QThreads不同的线程类型。这通常是不可取的,但这不是非法的。你需要注意三件事
Qt::QueuedConnection
或Qt::BlockingQueuedConnection
连接类型接收的信号。