使用QComboBox
填充项目的常规,如果currentIndex
设置为-1
,则小部件为空。在下拉列表中未显示的组合框中显示初始描述性文本(例如“--Select Country--”、“--Choose Topic--”等)将非常有用。
我在文档中找不到任何内容,也找不到任何以前的问题的答案。
组合框 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++)
(我不喜欢当我点击某个东西然后被困在我无法回到原来的地方时,即使它是一个尚未选择的状态!)
从 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)