向链接到模型的QComboBox添加“无”选项

时间:2012-03-19 16:29:14

标签: qt qt4 pyqt pyside

我有一个QComboBox,因此用户可以从模型列中获取网络名称。我正在使用这样的代码:

self.networkSelectionCombo = QtGui.QComboBox()
self.networkSelectionCombo.setModel(self.model.worldLinks)
self.networkSelectionCombo.setModelColumn(WLM.NET_NAME)

我正在使用PySide,但这确实是一个Qt问题。使用C ++的答案很好。

我需要为用户提供不选择任何网络的选项。我想要做的是在名为“无”的组合框中添加一个额外的项目。然而,这将被模型内容覆盖。

我能想到的唯一方法是在此模型列上创建一个中间自定义视图,并使用它来更新组合,然后视图可以处理添加额外的“魔术”项目。有谁知道更优雅的方式吗?

1 个答案:

答案 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
} 

现在您可以将此模型设置为组合框。