使用QAbstractTableModel(Model/View)时如何将"Select one..."添加到QComboBox?
How to add "Select one..." to QComboBox when using QAbstractTableModel (Model/View)?
我正在使用 QAbstractTableModel
填充 QComboBox
。这很好用,但我希望始终有第一个组合框索引包含 "Select one...".
的值
这可能吗?如果可能 - 如何实现?
我有一个 combobox
,我将其模型设置为:
model = ProjectTableModel(projects)
combobox.setModel(model)
我的模特:
class ProjectTableModel(QtCore.QAbstractTableModel):
def __init__(self, projects=[], parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._projects = projects
def rowCount(self, parent):
return len(self._projects)
def columnCount(self, parent):
return 2
def data(self, index, role):
row = index.row()
column = index.column()
if role == QtCore.Qt.DisplayRole and column == 0:
# Set the item's text
project = self._projects[row]
name = project.name()
return name
elif role == QtCore.Qt.UserRole and column == 0:
# Set the "itemData"
project = self._projects[row]
id = project.id()
return id
您可以在 getting/setting 值时添加适当的条件,并在必要时调整行 count/number。下面的示例显示了如何执行此操作,但您应该仔细检查所有代码,以确保在访问 _projects
项时始终正确调整该行。 (请注意,在访问模型本身的行时,您不需要调整行号)。
class ProjectTableModel(QtCore.QAbstractTableModel):
def __init__(self, projects=[], parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._projects = projects
def rowCount(self, parent):
return len(self._projects) + 1 # adjust row count
def columnCount(self, parent):
return 2
def data(self, index, role):
row = index.row() - 1 # adjust row number
column = index.column()
if role == QtCore.Qt.DisplayRole and column == 0:
if row >= 0:
# Set the item's text
project = self._projects[row]
return project.name()
else:
return 'Select one...'
elif role == QtCore.Qt.UserRole and column == 0 and row >= 0:
# Set the "itemData"
project = self._projects[row]
id = project.id()
return id
def setData(self, index, value, role):
row = index.row() - 1 # adjust row number
column = index.column()
# ignore the first item in the model
if role == QtCore.Qt.DisplayRole and column == 0 and row >= 0:
project = self._projects[row]
project.setName(value) # or whatever
我正在使用 QAbstractTableModel
填充 QComboBox
。这很好用,但我希望始终有第一个组合框索引包含 "Select one...".
这可能吗?如果可能 - 如何实现?
我有一个 combobox
,我将其模型设置为:
model = ProjectTableModel(projects)
combobox.setModel(model)
我的模特:
class ProjectTableModel(QtCore.QAbstractTableModel):
def __init__(self, projects=[], parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._projects = projects
def rowCount(self, parent):
return len(self._projects)
def columnCount(self, parent):
return 2
def data(self, index, role):
row = index.row()
column = index.column()
if role == QtCore.Qt.DisplayRole and column == 0:
# Set the item's text
project = self._projects[row]
name = project.name()
return name
elif role == QtCore.Qt.UserRole and column == 0:
# Set the "itemData"
project = self._projects[row]
id = project.id()
return id
您可以在 getting/setting 值时添加适当的条件,并在必要时调整行 count/number。下面的示例显示了如何执行此操作,但您应该仔细检查所有代码,以确保在访问 _projects
项时始终正确调整该行。 (请注意,在访问模型本身的行时,您不需要调整行号)。
class ProjectTableModel(QtCore.QAbstractTableModel):
def __init__(self, projects=[], parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._projects = projects
def rowCount(self, parent):
return len(self._projects) + 1 # adjust row count
def columnCount(self, parent):
return 2
def data(self, index, role):
row = index.row() - 1 # adjust row number
column = index.column()
if role == QtCore.Qt.DisplayRole and column == 0:
if row >= 0:
# Set the item's text
project = self._projects[row]
return project.name()
else:
return 'Select one...'
elif role == QtCore.Qt.UserRole and column == 0 and row >= 0:
# Set the "itemData"
project = self._projects[row]
id = project.id()
return id
def setData(self, index, value, role):
row = index.row() - 1 # adjust row number
column = index.column()
# ignore the first item in the model
if role == QtCore.Qt.DisplayRole and column == 0 and row >= 0:
project = self._projects[row]
project.setName(value) # or whatever