【问题标题】:How to disable right click in a QTreeWidget in PyQt?如何在 PyQt 的 QTreeWidget 中禁用右键单击?
【发布时间】:2015-09-27 08:00:54
【问题描述】:

我有一个 QTreeWidget,我想在其中禁用右键单击该项目。目前我正在使用itemClicked 信号来检测对treeWidget 的子级的点击,但我只想在用户左键单击某个项目时执行某些操作,而右键单击时不执行任何操作。现在都检测到左键和右键单击,我无法区分两者。 提前致谢!

【问题讨论】:

    标签: qt events pyqt mouse qtreewidget


    【解决方案1】:

    你可以重新实现treewidget的mouse release event

    class TreeWidget(QtGui.QTreeWidget):    
        def mouseReleaseEvent(self, event):
            if event.button() != QtCore.Qt.RightButton:
                super(TreeWidget, self).mouseReleaseEvent(event)
    

    或在 treewidget 的视口上安装 event-filter

    class MainWindow(QtGui.QMainWindow):
        def __init__(self):
            ...
            self.tree = QtGui.QTreeWidget(self)
            self.tree.viewport().installEventFilter(self)
    
        def eventFilter(self, source, event):
            if (event.type() == QtCore.QEvent.MouseButtonRelease and
                event.button() == QtCore.Qt.RightButton and
                source is self.tree.viewport()):
                return True
            return super(Window, self).eventFilter(source, event)
    

    【讨论】:

    • ItemClicked 真的是从MouseReleaseEvent 触发的吗?
    • @Mailerdaimon。最终,是的。它通过clicked 信号发出,该信号来自QAbstractItemViewmouseReleaseEvent。使用mousePressEvent 的等效代码将无法正常工作。具体来说,它不会吃掉选定项目的右键单击。 (如果这很重要,它还会更改右键单击时的选择行为)。
    • 谢谢。不知道!
    【解决方案2】:

    您可以覆盖 MouseEvent:

    void MyTreeWidget::mousePressEvent ( QMouseEvent * event )
    {
       event->accept();
    }
    

    要保持 Widget 的通常行为,您必须为所有要工作的按钮调用基类。

    void MyTreeWidget::mousePressEvent ( QMouseEvent * event )
    {
       if(event->button() == Qt::RightButton)
           event->accept(); // accept event and do nothing
       else:
           QTreeView::mousePressEvent(event)
    }
    

    编辑:

    刚刚注意到您正在使用 Python:机制是相同的,所以如果将上面的示例翻译成 Python 应该可以工作。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您想禁用选择。
      我对 PyQT 不熟悉,但在 C++ 中你应该编写如下代码:

      yourtreeView->setSelectionMode(QAbstractItemView::NoSelection);
      

      在这种情况下,项目不会被选中,但您仍会在它们周围看到焦点矩形。要解决此问题,您可以通过调用将您的小部件设置为不接受焦点:

      yourtreeView->setFocusPolicy(Qt::NoFocus);
      

      【讨论】:

      • 我不想禁用选择。只需右键单击选择。我仍然希望在左键单击时选择该项目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多