Добавление опции "нет" в QComboBox, связанный с моделью


У меня есть QComboBox, поэтому пользователь может использовать сетевое имя из столбца модели. Я использую такой код:

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

Я использую PySide, но это действительно вопрос Qt. Ответы на C++ нормально.

Мне нужно дать пользователю возможность не выбирать какую-либо сеть. Что я хотел бы сделать, так это добавить дополнительный пункт в поле со списком под названием "Нет". Однако это будет просто переопределено содержимым модели.

Единственный способ, который я могу придумать, - это создать промежуточное пользовательское представление в этом столбце модели и использовать его для обновления комбо, то представление может обрабатывать добавление в дополнительный элемент "магия". Кто-нибудь знает более элегантный способ сделать это?

1 4

1 ответ:

Одним из возможных решений является подкласс модели, которую вы используете, чтобы добавить туда дополнительный элемент. Реализация идет прямо вперед. Если вы вызываете свою модель 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
} 

Теперь вы можете установить эту модель в поле со списком.