19

使用QComboBox填充项目的常规,如果currentIndex设置为-1,则小部件为空。在下拉列表中未显示的组合框中显示初始描述性文本(例如“--Select Country--”、“--Choose Topic--”等)将非常有用。

我在文档中找不到任何内容,也找不到任何以前的问题的答案。

4

3 回答 3

28

组合框 API 中似乎没有预料到这种情况。但是,凭借底层模型的灵活性,您似乎应该能够将您的--Select Country-添加为第一个“合法”项目,然后防止它成为用户可选择的:

QStandardItemModel* model =
        qobject_cast<QStandardItemModel*>(comboBox->model());
QModelIndex firstIndex = model->index(0, comboBox->modelColumn(),
        comboBox->rootModelIndex());
QStandardItem* firstItem = model->itemFromIndex(firstIndex);
firstItem->setSelectable(false);

根据您想要的精确行为,您可能想要使用它setEnabled。或者我个人更喜欢它,如果它只是我可以将其设置回的不同颜色项目:

Qt,如何更改 QComboBox 的一项的文本颜色?(C++)

(我不喜欢当我点击某个东西然后被困在我无法回到原来的地方时,即使它是一个尚未选择的状态!)

于 2011-10-03T09:17:03.020 回答
7

您可以执行类似操作的一种方法是设置占位符:

comboBox->setPlaceholderText(QStringLiteral("--Select Country--"));
comboBox->setCurrentIndex(-1);

这样,您就有了一个无法选择的默认值。

在此处输入图像描述

于 2020-09-17T11:52:36.600 回答
2

从 PyQt5 将我的解决方案留在这里。创建一个代理模型并将所有行下移一位,并在第 0 行返回一个默认值。

class NullRowProxyModel(QAbstractProxyModel):
    """Creates an empty row at the top for null selections on combo boxes
    """

    def __init__(self, src, text='---', parent=None):
        super(NullRowProxyModel, self).__init__(parent)
        self._text = text
        self.setSourceModel(src)

    def mapToSource(self, proxyIndex: QModelIndex) -> QModelIndex:
        if self.sourceModel():
            return self.sourceModel().index(proxyIndex.row()-1, proxyIndex.column())
        else:
            return QModelIndex()

    def mapFromSource(self, sourceIndex: QModelIndex) -> QModelIndex:
        return self.index(sourceIndex.row()+1, sourceIndex.column())

    def data(self, proxyIndex: QModelIndex, role=Qt.DisplayRole) -> typing.Any:
        if proxyIndex.row() == 0 and role == Qt.DisplayRole:
            return self._text
        elif proxyIndex.row() == 0 and role == Qt.EditRole:
            return None
        else:
            return super(NullRowProxyModel, self).data(proxyIndex, role)

    def index(self, row: int, column: int, parent: QModelIndex = ...) -> QModelIndex:
        return self.createIndex(row, column)

    def parent(self, child: QModelIndex) -> QModelIndex:
        return QModelIndex()

    def rowCount(self, parent: QModelIndex = ...) -> int:
        return self.sourceModel().rowCount()+1 if self.sourceModel() else 0

    def columnCount(self, parent: QModelIndex = ...) -> int:
        return self.sourceModel().columnCount() if self.sourceModel() else 0

    def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...) -> typing.Any:
        if not self.sourceModel():
            return None
        if orientation == Qt.Vertical:
            return self.sourceModel().headerData(section-1, orientation, role)
        else:
            return self.sourceModel().headerData(section, orientation, role)
于 2020-03-20T00:00:43.107 回答