【问题标题】:QMdiSubWindow not accepting dropsQMdiSubWindow 不接受丢弃
【发布时间】:2016-03-14 08:44:28
【问题描述】:

我有这个小QT程序:

from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
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)

        fig = Figure(figsize=(5, 4), dpi=100, 
                     facecolor = self.palette().color(QtGui.QPalette.Background).name()
        )
        p = FigureCanvas(fig)
        self.axes = fig.add_subplot(111)
        self.axes.hold(False)
        FigureCanvas.setSizePolicy(
            self,
            QtGui.QSizePolicy.Expanding,
            QtGui.QSizePolicy.Expanding
        )
        FigureCanvas.updateGeometry(self)
        fig.tight_layout()
        toolbar = NavigationToolbar(p, self)
        self.layout().addWidget(toolbar)
        self.layout().addWidget(p)
        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()
        layout = QtGui.QGridLayout()
        mainwid.setLayout(layout)
        self.mdiarea = QtGui.QMdiArea()
        self.setCentralWidget(mainwid)
        layout.addWidget(self.mdiarea)
        sub = mplsubwindow(self.mdiarea)
        fig = Figure()
        p = FigureCanvas(fig)
        sub.layout().addWidget(p)
        sub.show()
        layout.addWidget(QtZListView())

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

if __name__ == '__main__':
    main()

我希望能够将底部列表中的一个或多个项目拖到 matplotlib 画布中。出于某种原因,仅调用了输入事件...其余的拖放事件似乎被忽略了...此外,即使我设置了 setAcceptDrops(True),QMdiSubWindow 似乎也不接受丢弃。 我在这里错过了什么?

【问题讨论】:

  • 正如我刚刚在answering your other question 中发现的那样,绕过QMdiSubWindow.setWidget() 并直接使用布局是个坏主意! setWidget 所做的一件事是安装一个事件过滤器(如果您查看 C++ 源代码)。我怀疑如果您在上面链接的答案中使用setWidget(),拖放行为会起作用。

标签: qt matplotlib pyqt


【解决方案1】:

您需要接受dragEnterEvent 方法中的事件,否则将忽略移动和放置事件。

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

请注意,我真的想强调您应该通过QMdiSubWindow.setWidget() 添加小部件。 MDI 窗口不完全支持任何其他方法(例如使用QMdiSubWindow.layout()QMdiSubWindow.setCentralWidget(),并且可能会导致其他问题。如果您觉得 setWidget() 没有达到您想要的效果,请提出一个新问题,详细说明该问题,以便在仍使用 setWidget() 的同时解决该问题。

【讨论】:

  • 感谢您澄清这一点
猜你喜欢
  • 2017-08-07
  • 2010-11-29
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2018-02-14
  • 2017-11-11
相关资源
最近更新 更多