支持 NULL 的 QComboBox

发布于 2024-12-28 13:29:06 字数 435 浏览 0 评论 0原文

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

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

还有什么是可能的 - 子类化 QComboBox (覆盖什么)?我没有看到任何类似于 setEditorData/setModelData 的内容,例如 QAbstractItemDelegate 中的控制项。

I'm using QComboBox to select unit (an arbitrary property of the object) from Units table. The problem is that object in my data model can have no unit (NULL in the table), in which case QComboBox shows value happened on top of the list. Select 'none' is not possible.
What do you suggest to add NULL support? I have few versions:

  1. Insert special record in Units table named '--' or 'N/A'. Not exactly NULL - will have its own id.
  2. Set items in QComboBox and update model manually. Possible but tedious - goodbye automatic update of unit list.

What else is possible - subclassing QComboBox (overriding what)? I don't see anything similar to setEditorData/setModelData like in QAbstractItemDelegate to control items.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绻影浮沉 2025-01-04 13:29:06

您可以对模型进行子类化,以便 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);
}

You can subclass the model, so that data will return a special value for NULL and then setData will check for the special value and substitute a NULL.

Example sketch of code:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文