如何禁用 PyQt 中 QTreeWidget 的右键单击?
How to disable right click in a QTreeWidget in PyQt?
我有一个 QTreeWidget,我想在其中禁用右键单击该项目。目前我正在使用 itemClicked
信号来检测对 treeWidget 子项的点击,但我只想在用户左键单击某个项目时执行某些操作,而在右键单击时不执行任何操作。现在检测到左键和右键单击,我无法区分这两者。
提前致谢!
如果我没听错你想禁用选择。
我对 PyQT 不熟悉,但在 C++ 中你应该这样写代码:
yourtreeView->setSelectionMode(QAbstractItemView::NoSelection);
在这种情况下,项目不会被选中,但您仍然会在它们周围看到焦点矩形。要解决此问题,您可以通过调用以下方式将小部件设置为不接受焦点:
yourtreeView->setFocusPolicy(Qt::NoFocus);
您可以覆盖 MouseEvent:
void MyTreeWidget::mousePressEvent ( QMouseEvent * event )
{
event->accept();
}
要保留 Widget 的通常行为,您必须为所有要工作的按钮调用基础 class。
void MyTreeWidget::mousePressEvent ( QMouseEvent * event )
{
if(event->button() == Qt::RightButton)
event->accept(); // accept event and do nothing
else:
QTreeView::mousePressEvent(event)
}
编辑:
刚刚注意到您正在使用 Python:机制是相同的,因此如果翻译成 Python,上面的示例应该可以工作。
您可以重新实现 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)
我有一个 QTreeWidget,我想在其中禁用右键单击该项目。目前我正在使用 itemClicked
信号来检测对 treeWidget 子项的点击,但我只想在用户左键单击某个项目时执行某些操作,而在右键单击时不执行任何操作。现在检测到左键和右键单击,我无法区分这两者。
提前致谢!
如果我没听错你想禁用选择。
我对 PyQT 不熟悉,但在 C++ 中你应该这样写代码:
yourtreeView->setSelectionMode(QAbstractItemView::NoSelection);
在这种情况下,项目不会被选中,但您仍然会在它们周围看到焦点矩形。要解决此问题,您可以通过调用以下方式将小部件设置为不接受焦点:
yourtreeView->setFocusPolicy(Qt::NoFocus);
您可以覆盖 MouseEvent:
void MyTreeWidget::mousePressEvent ( QMouseEvent * event )
{
event->accept();
}
要保留 Widget 的通常行为,您必须为所有要工作的按钮调用基础 class。
void MyTreeWidget::mousePressEvent ( QMouseEvent * event )
{
if(event->button() == Qt::RightButton)
event->accept(); // accept event and do nothing
else:
QTreeView::mousePressEvent(event)
}
编辑:
刚刚注意到您正在使用 Python:机制是相同的,因此如果翻译成 Python,上面的示例应该可以工作。
您可以重新实现 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)