Добавление опции "нет" в QComboBox, связанный с моделью
У меня есть QComboBox, поэтому пользователь может использовать сетевое имя из столбца модели. Я использую такой код:
self.networkSelectionCombo = QtGui.QComboBox()
self.networkSelectionCombo.setModel(self.model.worldLinks)
self.networkSelectionCombo.setModelColumn(WLM.NET_NAME)
Я использую PySide, но это действительно вопрос Qt. Ответы на C++ нормально.
Мне нужно дать пользователю возможность не выбирать какую-либо сеть. Что я хотел бы сделать, так это добавить дополнительный пункт в поле со списком под названием "Нет". Однако это будет просто переопределено содержимым модели.
Единственный способ, который я могу придумать, - это создать промежуточное пользовательское представление в этом столбце модели и использовать его для обновления комбо, то представление может обрабатывать добавление в дополнительный элемент "магия". Кто-нибудь знает более элегантный способ сделать это?
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 }
Теперь вы можете установить эту модель в поле со списком.