gpt4 book ai didi

python - try catch 鼠标位置时,QTreeView 上的 DoubleClick 事件没有结果

转载 作者:行者123 更新时间:2023-11-28 16:58:45 25 4
gpt4 key购买 nike

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

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

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

它可以工作并且打印了 OK。

但是,一旦我尝试捕捉光标位置,就什么也没有发生了。我已经尝试将整个小部件和 treeView 连接到一个简单的测试函数。它根本不起作用,甚至连 OK 都打印不出来。


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)

但是双击同一个 Widget 没有结果

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

我想使用指针位置来了解 TreeView 的哪个叶子必须发生变化,我想treeview.indexAt(点)将是这样做的方法,但由于我的简单函数根本没有被调用,所以一定有其他一些我没有看到的问题。

最佳答案

我觉得很奇怪,在您的第一个代码中打印了“OK”,返回给我的是一个错误,因为 connect 也需要一个可调用的,但是 print('OK') 返回的 None 不是一个可调用的。此外,mouseDoubleClickEvent 不是一个信号,而是一个事件,再次证实了我的奇怪。

相反,您必须使用 doubleClicked 信号返回与该项目关联的 QModelIndex,并且要获得必须使用 QCursor::的位置QTreeViewviewport()mapFromGlobal() 旁边的 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_())

关于python - try catch 鼠标位置时,QTreeView 上的 DoubleClick 事件没有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55846682/

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