我正在使用python3 + PyQt5。在我的程序中,该组合框内有QCombobox和QTreeView。 QCOmbobox的默认行为是单击某项时隐藏下拉列表。但是,就我而言,里面没有一个简单的列表,而是一个TreeView。因此,当我单击其中的“展开箭头”时,QCombobox会隐藏视图,因此我无法选择项目
python - 单击QTreeView项时防止QComboboxView自动崩溃-LMLPHP

我这里没有任何特定的代码,只有小部件初始化。我知道有信号和插槽,因此我的猜测是组合框捕获了单击事件,并将其包装为自己的行为。所以我认为我需要重写某些方法,但是我不确定到底是哪种方法。

最佳答案

您必须禁用对不想在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_())

关于python - 单击QTreeView项时防止QComboboxView自动崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50019909/

10-12 21:58