我主要是一名Python / Django开发人员,所以我的术语可能有些偏差,所以我找不到这个问题的答案:
我应该如何/在哪里定义C ++ / Qt中的自定义模型逻辑?
假设我有Users
列表date_birth
,我想添加方法getAge()
,它只是计算用户的年龄。
我会把它放在哪里?在我看来,创建一个QSqlRecord的子类是合适的,但我没有找到任何对这种方法的引用。
第二:是否存在子类化QSql(关系)的约定?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)并在其构造函数中调用所有这些方法是否常见?我再次找不到任何引用。
答案 0 :(得分:1)
你想要实现的是一个objets /关系映射。
所以这样做,最好不要让对象从任何SQL类继承(以任何对象语言)
您可以创建两个类:一个用于您的“employee”,另一个工厂对象将通过处理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);
答案 1 :(得分:0)
要在Qt中创建自己的模型,你应该 1.创建一个继承QSqlTableModel的类 2.如果需要实施:
QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const;
int rowCount( const QModelIndex& parent = QModelIndex() ) const;
3。添加您想要的任何方法 您可以找到更多信息here
答案 2 :(得分:0)
我可以为您提供另一种方法,您将使用代理模型将逻辑与数据源分开,而不是继承。
该方法看起来更灵活,更灵活,可以更改布局如何定义数据。 有一些文章可以提供更好的提示,如何以非常灵活的方式使用模型: