これはさらに別の回避策のように感じますが、私はそれを機能させました。この例では、SelectionModelは、QTreeWidgetのviewport()からマウスクリックイベントを取得するイベントフィルターでもあります。
以下も参照してください。
(これをオンザフライでハッキングしたので、何も除外しなかったといいのですが、実際の実装はもう少し複雑で、別のイベントフィルターを使用しています。)
from PyQt4.QtGui import QItemSelectionModel
from PyQt4.QtCore import QEvent
from PyQt4.QtCore import Qt
# In the widget class ('tree' is the QTreeWidget)...
# In __init___ ...
self.selection_model = CustomSelectionModel(self.tree.model())
self.tree.viewport().installEventFilter(self.selection_model)
# In the selection model...
class CustomSelectionModel(QItemSelectionModel):
def __init__(self, model):
super(CustomSelectionModel, self).__init__(model)
self.is_rmb_pressed = False
def eventFilter(self, event):
if event.type() == QEvent.MouseButtonRelease:
self.is_rmb_pressed = False
elif event.type() == QEvent.MouseButtonPress:
if event.button() == Qt.RightButton:
self.is_rmb_pressed = True
else:
self.is_rmb_pressed = False
def select(self, selection, selectionFlags):
# Do nothing if the right mouse button is pressed
if self.is_rmb_pressed:
return
# Fall through. Select as normal
super(CustomSelectionModel, self).select(selection, selectionFlags)