尝试捕获鼠标位置时,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_())
标签:qtreeview,pyqt,pyqt4,python 来源: https://codeday.me/bug/20191210/2104951.html