【问题标题】:PyQt4 Results in QThread errorPyQt4 导致 QThread 错误
【发布时间】:2012-02-18 04:53:00
【问题描述】:

使用 PyQt4 4.8.6 下面的代码会产生错误

QObject::startTimer:QTimer 只能用于以 QThread 启动的线程

当 a 用作 QApplication 的变量时,但如果 cpp(或大多数其他东西)用于变量,则不会产生错误。这是 PyQt4 中的错误还是我遗漏了什么?

#! /usr/bin/env python

# This is only needed for Python v2 but is harmless for Python v3.
import sip
sip.setapi('QVariant', 2)

from PyQt4 import QtGui

#def main():

if __name__ == '__main__':
    import sys

    if len(sys.argv) > 1:
       use_a = False
       print "Don't use a"
    else:
       use_a = True
       print "Use a"

    if use_a:
       a = QtGui.QApplication(sys.argv)
    else:
       cpp = QtGui.QApplication(sys.argv)

    model = QtGui.QStandardItemModel(4,2)
    tableView = QtGui.QTableView()
    tableView.setModel(model)

    tableView.show()
    if use_a:
       sys.exit(a.exec_())
    else:
       sys.exit(cpp.exec_())


#if __name__ == '__main__':
#  main()

【问题讨论】:

    标签: python pyqt pyqt4 qthread qtimer


    【解决方案1】:

    这可能不是错误。

    当 Python 开始关闭时,对象被垃圾收集的顺序可能无法预测。您看到的错误消息很可能是它的副作用。

    这是否会在您的应用程序中造成真正的问题?

    如果没有,只需根据需要重命名并忘记它......

    【讨论】:

    • 这不是问题,但我想了解发生了什么。
    • 我也有同样的问题,请问可以从控制台中删除此类错误信息吗?
    • 是否可以手动删除线程以防止出现这些错误消息??
    • @OrclUser。如果上面的答案没有帮助,那么你可能有一些 Qt 没有拥有所有权的 PyQt 对象。您需要为这些对象提供父对象和/或保留对它们的引用。如果没有看到真正的代码,不可能比这更精确。找出导致问题的对象的一种粗略方法是简单地注释掉代码块,直到消息消失,然后逐渐将其重新添加。很快就可以缩小问题范围。
    • 只需将视图设置为在关闭时删除。我添加了一个答案来说明如何。
    【解决方案2】:

    您需要将视图设置为在关闭时删除。这只需要在您的应用程序中添加以下两行:

    from PyQt4.QtCore import Qt
    

    然后在tableView实例化之后:

    tableView.setAttribute(Qt.WA_DeleteOnClose)
    

    当我将这些行添加到您的代码中时,我没有收到错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2017-07-31
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多