gpt4 book ai didi

python - 当我最小化 QMdiSubWindow 时,嵌套在 QMdiSubWindow 中的FigureCanvasQTAgg 出现段错误

转载 作者:行者123 更新时间:2023-12-01 04:04:01 25 4
gpt4 key购买 nike

我试图将FigureCanvasQTAgg放在QMdiSubWindow中,以便用户可以动态创建他/她自己的绘图。我编写了这个非常小的独立代码:

from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import sys

class ExampleApp(QtGui.QMainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.mdiarea = QtGui.QMdiArea()
self.setCentralWidget(self.mdiarea)
sub = QtGui.QMdiSubWindow(self.mdiarea)
fig = Figure()
p = FigureCanvas(fig)
sub.layout().addWidget(p)
sub.show()

def main():
app = QtGui.QApplication(sys.argv)
form = ExampleApp()
form.show()
app.exec_()

if __name__ == '__main__':
main()

当我运行程序并尝试最小化 QtGui.QMdiSubWindow 对象时,就会出现问题。当我这样做时,程序出现段错误并退出,没有错误描述。这可能是 qt、python 绑定(bind)或FigureCanvasQTAgg 对象中的错误。当然也可能是我错误地使用了这些元素。请帮助我理解为什么当我最小化子窗口时会发生段错误,并帮助我弄清楚如何解决这个问题。谢谢。

我的环境是ubuntu 14.04并使用Qt版本:4.8.7SIP版本:4.16.9PyQt版本:4.11.4MatplotLib版本:1.5.0

下面是拖放属性设置的示例。看来这也有问题。

from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import sys

class QtZListView(QtGui.QListView):
def __init__(self, *args, **kwargs):
QtGui.QListView.__init__(self, *args, **kwargs)
self.model = QtGui.QStringListModel(['a','b','c'])
self.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
self.setModel(self.model)
self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.setDragEnabled(True)

def setStringList(self, *args, **kwargs):
return self.model.setStringList(*args, **kwargs)

class mplsubwindow(QtGui.QMdiSubWindow):

def __init__(self, *args, **kwargs):
QtGui.QMdiSubWindow.__init__(self, *args, **kwargs)
self.setWindowTitle("testing")
self.setAcceptDrops(True)
self.resize(400,400)
self.show()

def dragEnterEvent(self, event):
print('entering')
super(mplsubwindow, self).dragEnterEvent(event)

def dragMoveEvent(self, event):
print('drag moving')
super(mplsubwindow, self).dragMoveEvent(event)

def dropEvent(self, event):
print('dropped')
super(mplsubwindow, self).dropEvent(event)

class ExampleApp(QtGui.QMainWindow):
def __init__(self):
super(self.__class__, self).__init__()
mainwid = QtGui.QWidget()
self.mdiarea = QtGui.QMdiArea()

layout = QtGui.QGridLayout(mainwid)
layout.addWidget(self.mdiarea)
sub = mplsubwindow(self.mdiarea)
sub.show()
layout.addWidget(QtZListView())
self.setCentralWidget(mainwid)
#self.setWidget(mainwid)

def main():
app = QtGui.QApplication(sys.argv)
form = ExampleApp()
form.show()
app.exec_()

if __name__ == '__main__':
main()

最佳答案

问题似乎是,当最小化时,小部件的高度为负(我想这是有道理的,但我找不到这个事实的任何文档;我通过添加一些打印语句注意到了这一点)。解决方案就是在这些情况下不绘制。我已经提交了PR要修复此上游问题,但您可能需要使用以下命令修补 matplotlib.backends.backend_qt5agg.FigureCanvasQTAggBase.__draw_idle_agg:

def __draw_idle_agg(self, *args):
if self.height() < 0 or self.width() < 0:
self._agg_draw_pending = False
return
try:
FigureCanvasAgg.draw(self)
self.update()
finally:
self._agg_draw_pending = False

请注意,模块中的 qt5 不是拼写错误,Qt4 功能源自 Qt5 支持。

关于python - 当我最小化 QMdiSubWindow 时,嵌套在 QMdiSubWindow 中的FigureCanvasQTAgg 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35977326/

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