如何在QComboBox上设置不可选的默认文本?

时间:2011-10-03 08:27:19

标签: c++ qt qcombobox

使用填充了项目的常规QComboBox,如果currentIndex设置为-1,则窗口小部件为空。在组合框中显示初始描述性文本(例如“ - 选择国家 - ”,“ - 选择主题 - ”等)将非常有用,这些文本未显示在下拉列表中。< / p>

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

3 个答案:

答案 0 :(得分:24)

在Combo Box API中似乎没有预料到这种情况。但是,由于基础模型的灵活性,您似乎应该能够将 - 选择国家/地区 - 添加为第一个“合法”项目,然后使其不被用户选择:

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, How do I change the text color of one item of a QComboBox? (C++)

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

答案 1 :(得分:3)

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

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

这样,您可以选择一个默认值。

enter image description here

答案 2 :(得分:1)

从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)