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
また、単体テストで上記のコードを実行しようとしましたが、結果は変わりませんでした。