Предотвращение автоматического коллапса QComboboxView при нажатии на элемент QTreeView
Я использую python3 + PyQt5. В моей программе у меня есть QCombobox и QTreeView внутри этого комбобокса. Поведение QCOmbobox по умолчанию - скрытие раскрывающегося списка при нажатии на элемент. Тем не менее, в моем случае в нем нет не просто списка, а TreeView. Поэтому, когда я нажимаю стрелку "Развернуть", QCombobox скрывает вид, поэтому я не могу выбрать элемент
У меня нет никакого конкретного кода здесь, только инициализация виджета. Я знаю, что есть сигналы и слоты, поэтому я предполагаю, что combobox отлавливает событие щелчка элемента и переносит его в свое собственное поведение. Поэтому я думаю, что мне нужно переопределить какой-то метод, но я не уверен, какой именно.
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_())