Предотвращение автоматического коллапса QComboboxView при нажатии на элемент QTreeView - PullRequest
0 голосов
/ 25 апреля 2018

Я использую python3 + PyQt5. В моей программе у меня есть QCombobox и QTreeView внутри этого комбобокса. Поведение QCOmbobox по умолчанию - скрытие раскрывающегося списка при нажатии на элемент. Тем не менее, в моем случае в нем нет не просто списка, а TreeView. Поэтому, когда я нажимаю стрелку «Развернуть», QCombobox скрывает вид, поэтому я не могу выбрать элемент enter image description here

У меня нет никакого конкретного кода здесь, только инициализация виджета. Я знаю, что есть сигналы и слоты, поэтому я предполагаю, что combobox отлавливает событие щелчка элемента и переносит его в свое собственное поведение. Поэтому я думаю, что мне нужно переопределить какой-то метод, но я не уверен, какой именно.

1 Ответ

0 голосов
/ 25 апреля 2018

Вы должны отключить возможность выбора элемента для элементов, которые вы не хотите устанавливать в 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...