2

QComboBoxUnits テーブルから unit (オブジェクトの任意のプロパティ) を選択するために使用しています。問題は、データ モデル内のオブジェクトに単位がない (テーブル内の NULL) ことができないことです。この場合QComboBox、値がリストの先頭に表示されます。「なし」を選択することはできません。
NULL サポートを追加するために何を提案しますか? 私はいくつかのバージョンを持っています:

  1. Units テーブルに「--」または「N/A」という名前の特別なレコードを挿入します。厳密には NULL ではありません - 独自の ID があります。
  2. モデルに項目を設定しQComboBox、手動でモデルを更新します。可能だが面倒 - さようならユニットリストの自動更新。

他に何が可能ですか - サブクラス化QComboBox(何をオーバーライドしますか)? アイテムを制御するためにsetEditorData似たsetModelDataようなものは見当たりません。QAbstractItemDelegate

4

1 に答える 1

1

モデルをサブクラス化して、dataNULL の特別な値を返し、特別な値を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);
}
于 2012-01-23T12:59:30.493 に答える