如果我尝试在 QTreeWidget 上使用 QTest.mouseClick 它会从 C++ 库中引发一个断言。
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:52:43)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
from PySide import QtCore, QtGui
from PySide.QtCore import Qt
from PySide.QtTest import QTest
app = QtGui.QApplication([])
tree = QtGui.QTreeWidget()
tree.headerItem().setText(0,"")
tree.headerItem().setText(1,"")
tree.headerItem().setText(2,"")
item = QtGui.QTreeWidgetItem(tree)
item.setText(0,"a")
item.setText(1,"b")
item.setText(2,"c")
QTest.mouseClick(tree,Qt.LeftButton,pos=tree.visualItemRect(item).topLeft())
ASSERT: "QTest::testLogger" in file qtestlog.cpp, line 334
Abort trap: 6
我使用的是 PySide 1.2.2,我在 OS X (10.9.3) 和 Windows7 上都试过了,结果完全相同。
我是在做不正确的事情还是发现了 PySide 错误(我担心是后者)?
更新:
@Trilarion 的建议给了我一个想法。我尝试将父级添加到 QTreeWidget。这样做解决了 ASSERT,但是 QTreeWidget 似乎根本没有注册模拟点击。
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:52:43)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
from PySide import QtCore, QtGui
from PySide.QtCore import Qt
from PySide.QtTest import QTest
def click():
global tree,item
print "Start Click"
for x in xrange(0,1000):
for y in xrange(0,1000):
QTest.mouseClick(tree,Qt.LeftButton,pos=QtCore.QPoint(x,y))#tree.visualItemRect(item).topLeft())
print "End click"
def was_clicked():
print "Tree Was Clicked"
def beep():
print "button was clicked"
app = QtGui.QApplication([])
window = QtGui.QWidget()
tree = QtGui.QTreeWidget(window)
tree.headerItem().setText(0,"")
tree.headerItem().setText(1,"")
tree.headerItem().setText(2,"")
item = QtGui.QTreeWidgetItem(tree)
item.setText(0,"a")
item.setText(1,"b")
item.setText(2,"c")
tree.clicked.connect(was_clicked)
button = QtGui.QPushButton(window)
button.clicked.connect(beep)
#Sanity check to make sure that the button is registering the click
QTest.mouseClick(button,Qt.LeftButton)
#Overkill click test, try clicking the tree on every point in a 1000 x 1000 grid
click()
button was clicked
StartClick
EndClick
我还尝试在单元测试中运行上述代码,并没有改变结果。