【问题标题】:QComboBox with NULL support具有 NULL 支持的 QComboBox
【发布时间】:2023-03-30 04:57:01
【问题描述】:

我正在使用QComboBox 从单位表中选择单位(对象的任意属性)。问题是我的数据模型中的对象可以没有单位(表中为 NULL),在这种情况下,QComboBox 显示值发生在列表顶部。无法选择“无”。
您建议添加 NULL 支持什么?我有几个版本:

  1. 在名为“--”或“N/A”的单位表中插入特殊记录。不完全是 NULL - 会有自己的 id。
  2. QComboBox 中设置项目并手动更新模型。可能但乏味 - 再见单元列表的自动更新。

还有什么可能——继承QComboBox(覆盖什么)?我没有看到任何类似于setEditorData/setModelData 的东西,比如QAbstractItemDelegate 来控制项目。

【问题讨论】:

  • 让我们暂时忘记QComboBox,告诉我您何时从数据库中获取数据,您如何在对象表示中存储NULL
  • 从数据库中提取数据并存储在对象集合中(手动而不是使用任何 ORM,但我正在处理它。)然后,QStandardItemModel 被创建并填充要提交以供编辑的数据。我有可编辑对象的列表(称为枚举),用户可以在QTableView 中选择行并使用带有组合框的编辑器来编辑枚举。 NULL 显然来自 DB 作为 null QVariant,然后存储为整数 0(我有规则 id
  • 直到我向某人解释情况后才想到 :) 当然,当在列表中选择项目时,我可以用编辑器做任何我需要的事情,包括添加 NULL 选项。抱歉,我要结束这个问题了。

标签: qt null qcombobox


【解决方案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);
}

【讨论】:

  • 不确定如何应用...例如,Units 表中有三个单位:m、s 和 g。组合框显示 m、s、g,我想在列表顶部添加“无”。 MyModel::data 将被调用 3 次以提取 m、s 和 g,我需要一些事件从它被调用的地方添加“无”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2012-05-15
相关资源
最近更新 更多