单击QTreeView项时阻止QComboboxView自动裁剪

时间:2018-04-25 10:27:03

标签: python python-3.x pyqt pyqt5

我正在使用python3 + PyQt5。在我的程序中,我有QCombobox和组合框内的QTreeView。 QCOmbobox的默认行为是在单击项目时隐藏下拉列表。但是,在我的情况下,里面没有一个简单的列表,而是一个TreeView。因此,当我点击其中的展开箭头时,QCombobox会隐藏视图,因此我无法选择项目 enter image description here

我这里没有任何特定的代码,只是小部件初始化。我知道有信号和插槽所以我的猜测是组合框捕获项目点击事件并将其包装在自己的行为中。所以我认为我需要覆盖一些方法,但我不确定究竟是哪一种。

1 个答案:

答案 0 :(得分:1)

您必须禁用可选择您不想在QComboBox中设置的项目的项目,例如:

import sys

from PyQt5 import QtWidgets, QtGui


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QComboBox()
    model = QtGui.QStandardItemModel()
    for i in range(3):
        parent = model
        for j in range(3):
            it = QtGui.QStandardItem("parent {}-{}".format(i, j))
            if j != 2:
                it.setSelectable(False)
            parent.appendRow(it)
            parent = it
    w.setModel(model)

    view = QtWidgets.QTreeView()
    w.setView(view)
    w.show()
    sys.exit(app.exec_())

更优雅的解决方案是覆盖模型的标志:

import sys

from PyQt5 import QtWidgets, QtGui, QtCore

class StandardItemModel(QtGui.QStandardItemModel):
    def flags(self, index):
        fl = QtGui.QStandardItemModel.flags(self, index)
        if self.hasChildren(index):
            fl &= ~QtCore.Qt.ItemIsSelectable
        return fl

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QComboBox()
    model = StandardItemModel()
    for i in range(3):
        parent = model
        for j in range(3):
            it = QtGui.QStandardItem("parent {}-{}".format(i, j))
            parent.appendRow(it)
            parent = it
    w.setModel(model)
    view = QtWidgets.QTreeView()
    w.setView(view)
    w.show()
    sys.exit(app.exec_())