2012-01-23 2 views
1

Я использую QComboBox для выбора единицы (произвольного свойства объекта) из таблицы Units. Проблема в том, что объект в моей модели данных не может иметь единицы (NULL в таблице), и в этом случае QComboBox показывает значение, которое произошло в верхней части списка. Выбрать «none» невозможно.
Что вы предлагаете добавить поддержку NULL? У меня несколько версий:QComboBox с поддержкой NULL

  1. Вставьте специальную запись в таблицу Units с именем '-' или 'N/A'. Не точно NULL - будет иметь свой собственный идентификатор.
  2. Установить изделия в категории QComboBox и обновить модель вручную. Возможное, но утомительное - прощай автоматическое обновление списка модулей.

Что еще возможно - подклассификация QComboBox (переопределение чего)? Я не вижу ничего подобного setEditorData/setModelData, как в QAbstractItemDelegate для управления элементами.

+0

Давайте забудем на минуту о 'QComboBox' и скажите мне, когда вы получаете данные из базы данных, как вы хранящие' NULL' в вашем представлении объекта? – Karlson

+0

Данные извлекаются из базы данных и хранятся в коллекциях объектов (вручную вместо использования любого ORM, но я над этим работаю.) Затем создаются и заполняются эти данные QStandardItemModel, которые должны быть представлены для редактирования. У меня есть список редактируемых объектов (называемых Enums), пользователь может выбрать строку в 'QTableView' и использовать редактор с combobox для редактирования Enum. NULL, очевидно, поступает из БД как нулевой QVariant и затем сохраняется как целое число 0 (у меня есть правило, что id <= 0 недопустимы.) – alxx

+0

Не пришло в голову, пока я не объяснил ситуацию кому-то :) Конечно, когда выбран пункт в списке я могу сделать с редактором все, что мне нужно, включая добавление опции NULL. Извините за это slowpoking, я закрываю вопрос. – alxx

ответ

1

Вы можете подклассифицировать модель, так что data вернет специальное значение для NULL, а затем setData проверит специальное значение и заменит NULL.

Пример эскиз коды:

class MyModel : public QSqlTableModel 
{ 
    Q_OBJECT 
    public: 
    MyModel(); 
    virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; 
    virtual bool setData(const QModelIndex &index, const QVariant &value, int role); 
}; 

QVariant MyModel::data(const QModelIndex& idx, int role) 
{ 
    QVariant var = QSqlTableModel::data(idx, role); 
    if (var.isNull()) 
    var = QVariant(QString("NULL")); 
    return var; 
} 

bool MyModel::setData(const QModelIndex& idx, const QVariant& value, int role) 
{ 
    QVariant var(value); 
    if (var == QString("NULL")) 
    var == QVariant(record().field(idx.column()).type()); 
    return QSqlTableModel::setData(idx, var, role); 
} 
+0

Не знаете, как применить это ... Например, в таблице Units есть три единицы: m, s и g. Combobox показывает m, s, g, и я хочу добавить «none» поверх списка. 'MyModel :: data' будет вызываться три раза, чтобы вытащить m, s и g, и мне нужно какое-то событие, из которого он вызывается, чтобы добавить 'none'. – alxx

Смежные вопросы