尝试捕获鼠标位置时,QTreeView上的DoubleClick事件没有结果

我正在使用Python 3.6和pyqt 4.11.我将两个QTreeViews堆叠在一个Widget中,它们两个都显示一些批处理作业,因此每个步骤都可以扩展以显示所有功能.我希望能够双击树视图的一行并生成一个弹出对话框,在其中可以编辑双击函数的参数.

如果我在没有捕获位置的情况下连接了双击信号:

self.connect(self.QTreeView, QtCore.SIGNAL('mouseDoubleClickEvent()'),print('OK'))

它可以正常工作,并且可以打印.

但是,一旦我尝试捕获光标位置,就不再发生任何事情.我已经尝试将整个小部件和treeView连接到一个简单的测试功能.它根本不起作用,甚至无法打印.


self.connect(self.QTreeView, QtCore.SIGNAL('mouseDoubleClickEvent(const QPoint &)'),self.showDlg)

def showDlg (self, point):
        print ('OK')
        treeidx=self.treeview.indexAt(point)
        print (treeidx)

右键单击整个Widget即可触发ContextMenu,并且它可以正常工作

self.QTreeWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)   

self.connect(self.QTreeWidget, QtCore.SIGNAL('customContextMenuRequested(const QPoint &)'), self.customMyContextMenu)

但是双击相同的小部件不会产生任何结果

self.connect(self.QTreeWidget, QtCore.SIGNAL('mouseDoubleClickEvent(const QPoint &)'),self.showDlg)

我想使用指针位置来知道必须在树形视图的哪个叶子中进行更改,我想
treeview.indexAt(point)
可能是这样做的方法,但是由于根本没有调用我的简单函数,所以肯定还有其他一些我看不到的问题.

解决方法:

我觉得很奇怪,在您的第一个代码中打印“ OK”,返回给我的是一个错误,因为connect也期望可调用,但是print(‘OK’)返回None,这不是可调用的.此外,mouseDoubleClickEvent不是信号,而是重申我的陌生性的事件.

取而代之的是,您必须使用doubleClicked信号来返回与该项目关联的QModelIndex,并且要获取位置,您必须使用QTreeView的viewport()的mapFromGlobal()旁边的QCursor :: pos().您还必须使用新的连接语法.

from PyQt4 import QtCore, QtGui


def create_model(parent):
    model = QtGui.QStandardItemModel(parent)
    for i in range(3):
        parent_item = QtGui.QStandardItem("Family {}".format(i))
        for j in range(3):
            child1 = QtGui.QStandardItem("Child {}".format(i * 3 + j))
            child2 = QtGui.QStandardItem("row: {}, col: {}".format(i, j + 1))
            child3 = QtGui.QStandardItem("row: {}, col: {}".format(i, j + 2))
        parent_item.appendRow([child1, child2, child3])
        model.appendRow(parent_item)
    return model


class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self._tree_view = QtGui.QTreeView()
        self._tree_view.setModel(create_model(self))
        self._tree_view.expandAll()
        lay = QtGui.QVBoxLayout(self)
        lay.addWidget(self._tree_view)

        self._tree_view.doubleClicked.connect(self.on_doubleClicked)

    @QtCore.pyqtSlot("QModelIndex")
    def on_doubleClicked(self, ix):
        print(ix.data())

        gp = QtGui.QCursor.pos()
        lp = self._tree_view.viewport().mapFromGlobal(gp)
        ix_ = self._tree_view.indexAt(lp)
        if ix_.isValid():
            print(ix_.data())


if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

PySide版本:

from PySide import QtCore, QtGui


def create_model(parent):
    model = QtGui.QStandardItemModel(parent)
    for i in range(3):
        parent_item = QtGui.QStandardItem("Family {}".format(i))
        for j in range(3):
            child1 = QtGui.QStandardItem("Child {}".format(i * 3 + j))
            child2 = QtGui.QStandardItem("row: {}, col: {}".format(i, j + 1))
            child3 = QtGui.QStandardItem("row: {}, col: {}".format(i, j + 2))
        parent_item.appendRow([child1, child2, child3])
        model.appendRow(parent_item)
    return model


class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self._tree_view = QtGui.QTreeView()
        self._tree_view.setModel(create_model(self))
        self._tree_view.expandAll()
        lay = QtGui.QVBoxLayout(self)
        lay.addWidget(self._tree_view)

        self._tree_view.doubleClicked.connect(self.on_doubleClicked)

    @QtCore.Slot("QModelIndex")
    def on_doubleClicked(self, ix):
        print(ix.data())

        gp = QtGui.QCursor.pos()
        lp = self._tree_view.viewport().mapFromGlobal(gp)
        ix_ = self._tree_view.indexAt(lp)
        if ix_.isValid():
            print(ix_.data())


if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
上一篇:PyQt的安装和使用


下一篇:python-使用QNetworkAccessManager进行Qt HTTP身份验证