0

有没有办法检测从 QItemSelectionModel 中单击了哪个鼠标按钮?

我想阻止鼠标右键单击更改选择。

我用的是QTreeWidget,所以如果有办法屏蔽整个东西,那就太好了,但是右键单击仍然用于上下文菜单,所以我没有追求这种思路。

仍在尝试……我偶然发现了这一点,但我无法运行该函数:http: //qt-project.org/faq/answer/how_to_prevent_right_mouse_click_selection_for_a_qtreewidget 这意味着一个简单的覆盖,但这并没有在 Python 中工作

def mousePressEvent(self, mouse_event):
    super(MyTreeWidget, self).mousePressEvent(mouse_event)
    print "here %s" % event.type()
4

1 回答 1

1

这感觉像是另一种解决方法,但我得到了它的工作。在这个例子中,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)
于 2012-06-29T18:25:18.273 回答