Показать элемент в QComboBox, но не в его всплывающем списке - PullRequest
3 голосов
/ 06 ноября 2019

Select product

У меня есть код, который позволяет использовать комбинированный список для отображения списка продуктов. Я хотел бы показать "Выбрать продукт" в выпадающем списке:

products = ["Select product", "223", "51443" , "7335"]

, но я не хочу, чтобы пользователь мог выбрать пункт "Выбрать продукт". Я просто хочу, чтобы пользователь знал, что этот комбинированный список используется для выбора продукта, и я не хочу использовать QLabel для его идентификации.

page.comboBox.addItems(products)
page.comboBox.setPlaceHolderText("Please select")
page.comboBox.setGeometry(150, 30, 105, 40)

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Элемент во всплывающем списке можно скрыть следующим образом:

self.combo.view().setRowHidden(0, True)

Однако это все же позволяет выбирать скрытый элемент с помощью клавиатуры или колесика мыши. Чтобы предотвратить это, скрытый элемент можно отключить в слоте, подключенном к сигналу activated. Это означает, что после правильного выбора сообщение больше не отображается. Чтобы вернуть его (например, при сбросе формы), элемент можно просто повторно включить.

Вот базовая демонстрация, которая реализует все это:

enter image description here

import sys
from PyQt5 import QtCore, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtWidgets.QPushButton('Reset')
        self.button.clicked.connect(self.handleReset)
        self.combo = QtWidgets.QComboBox()
        layout = QtWidgets.QHBoxLayout(self)
        layout.addWidget(self.combo)
        layout.addWidget(self.button)
        products = ['Select product', '223', '51443' , '7335']
        self.combo.addItems(products)
        self.combo.view().setRowHidden(0, True)
        self.combo.activated.connect(self.showComboMessage)

    def showComboMessage(self, index=-1, enable=False):
        if index:
            self.combo.model().item(0).setEnabled(enable)

    def handleReset(self):
        self.showComboMessage(enable=True)
        self.combo.setCurrentIndex(0)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setWindowTitle('Combo Demo')
    window.setGeometry(600, 100, 100, 75)
    window.show()
    sys.exit(app.exec_())
0 голосов
/ 06 ноября 2019

Попробуйте использовать:

page.comboBox.setMinimumContentsLength(30) 
...