Добавление опции «Нет» в QComboBox, связанный с моделью - PullRequest
4 голосов
/ 19 марта 2012

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

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

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

Мне нужно дать пользователю возможность не выбирать сеть. Я хотел бы добавить дополнительный элемент в поле со списком «Нет». Однако это просто будет переопределено содержимым модели.

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

1 Ответ

3 голосов
/ 19 марта 2012

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

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

...