如何抑制警告QPixmap:在GUI线程外使用pixmaps是不安全的

时间:2014-06-18 15:23:32

标签: python qt error-handling pyqt suppress-warnings

我有这个错误充斥我的终端并使其无法调试。有没有办法让这个警告沉默?仅当我在TableWidget上包含scrollToBottom()时才会生成此错误。

3 个答案:

答案 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不同的线程类型。这通常是不可取的,但这不是非法的。你需要注意三件事

  1. 所有调用应最终从QThreads对象中的调用执行
  2. 应通过信号槽机制传递的所有数据,使得没有对非QThread拥有的对象的引用/指针。
  3. 在接收来自非QThreads的呼叫的对象之间建立连接,以发出使用Qt::QueuedConnectionQt::BlockingQueuedConnection连接类型接收的信号。