gpt4 book ai didi

python - 关闭应用程序时多次出现错误 "QObject::startTimer: QTimer can only be used with threads started with QThread"

转载 作者:太空狗 更新时间:2023-10-30 00:22:50 25 4
gpt4 key购买 nike

我知道这已经被问过很多次了。我阅读了所有这些主题,我的情况似乎有所不同。其他遇到此问题的人都有一些我认为已排除的直接原因,例如:

  • 启动一个没有事件循环运行的定时器
  • 从创建计时器的线程以外的线程启动/停止计时器
  • 未能设置小部件的父属性,导致销毁顺序出现问题

下面我有一个演示问题的最小代码示例。请注意,我没有启动任何线程或计时器。我还设置了每个小部件的父级。如果我删除图形小部件,问题就会消失,所以人们很想责怪 pyQtGraph,但是,如果我包含绘图小部件但排除所有空白选项卡(即除 tabCatchaTiger 之外的每个选项卡),问题也会消失,并且似乎证明 pyQtGraph 是正确的。

版本:

  • window 7
  • python 2.7.8
  • 翼IDE 5.0.9-1
  • PyQt 4.11.1
  • PyQwt 5.2.1
  • PyQtGraph 0.9.8

测试用例:

from PyQt4 import Qt, QtGui, QtCore
import PyQt4.Qwt5 as Qwt
import pyqtgraph as pg

pg.functions.USE_WEAVE = False # Lets pyqtgraph plot without gcc

pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')

# GUI for visualizing data from database
class crashyGUI(QtGui.QWidget) :

def __init__(self) :
# Make the window
QtGui.QWidget.__init__(self)
self.resize(700, QtGui.QDesktopWidget().screenGeometry(self).height()*.85)
self.setWindowTitle('Data Visualization')

# Create tab interface
tabWidget = QtGui.QTabWidget(self)

# define the tab objects
self.tabEeny = QtGui.QWidget(tabWidget)
self.tabMeeny = QtGui.QWidget(tabWidget)
self.tabMiney = QtGui.QWidget(tabWidget)
self.tabMoe = QtGui.QWidget(tabWidget)
self.tabCatchaTiger = QtGui.QWidget(tabWidget)
self.tabByThe = QtGui.QWidget(tabWidget)
self.tabToe = QtGui.QWidget(tabWidget)

# Initialize the tab objects
self.initTabCatchaTiger()

###########################################
############### Main Layout ###############
###########################################

tabWidget.addTab(self.tabEeny, 'Eeny')
tabWidget.addTab(self.tabMeeny, 'Meeny')
tabWidget.addTab(self.tabMiney, 'Miney')
tabWidget.addTab(self.tabMoe, 'Moe')
tabWidget.addTab(self.tabCatchaTiger, 'Catch a Tiger')
tabWidget.addTab(self.tabByThe, 'By The')
tabWidget.addTab(self.tabToe, 'Toe')

self.mainLayout = QtGui.QVBoxLayout(self)
self.mainLayout.addWidget(tabWidget)

self.setLayout(self.mainLayout)

def initTabCatchaTiger(self):
###########################################
############# ADC Capture Tab #############
###########################################
# define tab layout
grid = QtGui.QGridLayout(self.tabCatchaTiger)

# create copy of adc plot and add to row 3 of the grid
self.catchaTigerPlot1 = pg.PlotWidget(name = 'Catch a Tiger 1', parent = self.tabCatchaTiger)
self.catchaTigerPlot1.setTitle('Catch a Tiger 1')
grid.addWidget(self.catchaTigerPlot1, 2, 0, 1, 8)

self.catchaTigerPlot2 = pg.PlotWidget(name = 'Catch a Tiger 2', parent = self.tabCatchaTiger)
self.catchaTigerPlot2.setTitle('Catch a Tiger 2')
grid.addWidget(self.catchaTigerPlot2, 3, 0, 1, 8)

# set layout for tab
self.tabCatchaTiger.setLayout(grid)

def closeEvent(self, event) :
pass

def main() :
# open a QApplication and dialog() GUI
app = QtGui.QApplication([])

windowCrashy = crashyGUI()
windowCrashy.show()
app.exec_()

main()

最佳答案

示例中似乎有两个密切相关的问题。

第一个导致 Qt 在退出时打印 QObject::startTimer: QTimer can only be used with threads started with QThread 消息。

第二个(可能不会影响所有用户)导致 Qt 打印QPixmap: Must construct a QApplication before a QPaintDevice,然后在退出时转储核心。

这两个问题都是由 python 在退出时以不可预测的顺序删除对象引起的。

在示例中,可以通过将以下行添加到顶级窗口的 __init__ 来解决第二个问题:

    self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

除非QApplication.setQuitOnLastWindowClosed已更改为 False,这将确保应用程序在正确的时间退出,并且 Qt 有机会在 python 垃圾收集器获取之前自动删除顶级窗口的所有子窗口去工作。

然而,要使其完全成功,所有相关对象必须在父子层次结构中链接在一起。示例代码尽可能地做到了这一点,但在 PlotWidget 类的初始化中似乎有一些关键位置没有完成。

特别是,没有任何东西可以确保 PlotWidget 的中心项在创建时具有父集。如果代码的相关部分更改为:

class PlotWidget(GraphicsView):
...
def __init__(self, parent=None, background='default', **kargs):
GraphicsView.__init__(self, parent, background=background)
...
self.plotItem = PlotItem(**kargs)
# make sure the item gets a parent
self.plotItem.setParent(self)
self.setCentralItem(self.plotItem)

然后 QTimer 消息的第一个问题也消失了。

关于python - 关闭应用程序时多次出现错误 "QObject::startTimer: QTimer can only be used with threads started with QThread",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com