使用填充了项目的常规QComboBox
,如果currentIndex
设置为-1
,则窗口小部件为空。在组合框中显示初始描述性文本(例如“ - 选择国家 - ”,“ - 选择主题 - ”等)将非常有用,这些文本未显示在下拉列表中。< / p>
我在文档中找不到任何内容,也没有任何先前的答案问题。
答案 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);
这样,您可以选择一个默认值。
答案 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)