1

我主要是 Python/Django 开发人员,所以我的术语可能有点偏离,所以我找不到这个问题的答案:

我应该如何/在哪里定义 C++/Qt 中的自定义模型逻辑?

假设我有一个Users带有列的表date_birth,我想添加方法getAge(),它只是计算用户的年龄。

我会把这个放在哪里?在我看来,创建 QSqlRecord 的子类很合适,但我还没有找到对这种方法的任何引用。

第二:继承QSql(Relational)?TableModel有什么约定吗?

我在许多示例中发现了类似的片段:

QSqlTableModel *model = new QSqlTableModel(parentObject, database);
model->setTable("employee");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

但是在我需要的任何地方定义它似乎是多余的。创建诸如 UserTableModel 之类的子类并在其构造函数中调用所有这些方法是否很常见?同样,我还没有找到任何对它的引用。

4

3 回答 3

1

您要实现的是对象/关系映射。

所以这样做,最好不要让对象继承自任何 SQL 类(在任何对象语言中)

您可以创建 2 个类:一个用于您的“员工”,一个工厂对象将通过处理 SQL 来创建该对象:

ObjectsFactory *factory = new ObjectsFactory();
Employee e = factory->getEmployee(2423);
int age = e->getAge();

使用这种解决方案,您的 Employee 类将不依赖于 SQL 类。您甚至可以选择根据任何存储模型创建处理程序。

ObjectFactory *factory = new ObjectsFactory(new SQLHandler);

或(更方便测试)

ObjectFactory *factory = new ObjectsFactory(new FileHandler);

ObjectFactory *factory = new ObjectsFactory(new MemoryHandler);

我建议你看看数据访问对象模式

于 2012-12-18T10:38:27.863 回答
0

要在 Qt 中创建自己的模型,您应该
1. 创建一个继承 QSqlTableModel 的类
2. 如果需要,实现:

QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const;
int rowCount( const QModelIndex& parent = QModelIndex() ) const;

3.添加您想要的任何方法。
您可以在这里找到更多信息

于 2012-12-18T11:17:48.570 回答
0

我可以为您提供另一种方法,而不是继承,您将使用代理模型将逻辑与数据源分开。

该方法对于数据定义方式的布局变化看起来更加灵活和健壮。有一些文章可以为如何以非常灵活的方式使用模型提供更多好的提示:

http://lynxline.com/category/models/

于 2014-01-19T13:41:59.003 回答