我有一个QComboBox,因此用户可以从模型列中获取网络名称。我正在使用这样的代码:
self.networkSelectionCombo = QtGui.QComboBox()
self.networkSelectionCombo.setModel(self.model.worldLinks)
self.networkSelectionCombo.setModelColumn(WLM.NET_NAME)
我正在使用PySide,但这确实是一个Qt问题。使用C ++的答案很好。
我需要为用户提供不选择任何网络的选项。我想要做的是在名为“无”的组合框中添加一个额外的项目。然而,这将被模型内容覆盖。
我能想到的唯一方法是在此模型列上创建一个中间自定义视图,并使用它来更新组合,然后视图可以处理添加额外的“魔术”项目。有谁知道更优雅的方式吗?
答案 0 :(得分:3)
一种可能的解决方案是对您正在使用的模型进行子类化,以便在其中添加额外项目。实施是直截了当的。如果你调用模型MyModel
,那么子类看起来像这样(使用C ++):
class MyModelWithNoneEntry : public MyModel
{
public:
int rowCount() {return MyModel::rowCount()+1;}
int columnCount() {return MyModel::columnCOunt();}
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const
{
if (index.row() == 0)
{
// if we are at the desired column return the None item
if (index.column() == NET_NAME && role == Qt::DisplayRole)
return QVariant("None");
// otherwise a non valid QVariant
else
return QVariant();
}
// Return the parent's data
else
return MyModel::data(createIndex(index.row()-1,index.col()), role);
}
// parent and index should be defined as well but their implementation is straight
// forward
}
现在您可以将此模型设置为组合框。