3

我想创建一个软件来浏览一些数据库表并且用户将能够编辑这些表。在阅读此链接之后,我认为模型/视图是满足我需要的好方法。看看下面的模型: 在此处输入图像描述

知道了这一点,我有一些问题要确保我理解这个概念。请告诉我我是否朝着好的方向发展:

  1. 我想我需要为每个表创建一个模型类?(子类化 QAbstractModel)。它看起来像这样:

    class citiesTableModel : public QAbstractItemModel
     {
         Q_OBJECT
     }
    
  2. cityTableModel 构造函数会从数据库中的表中获取数据吗?

    QAbstractItemModel *model = new citiesTableModel(); //model will contain 2 rows, New York and Seattle
    
  3. 我需要为每个不同的模型子类 QTableView 吗?

    class citiesTableView : public QTableView{}
    
  4. Finnaly,我猜 view.setData 和 view.setModel 需要重新实现?setModel 将遍历每个模型行以构建 QTableView,而 setData 将执行适当的查询以在模型中添加新数据?

非常感谢你。

4

2 回答 2

3

基本上你有不同的选择:

您的数据库是 SQL 数据库。您可以使用子类QSqlTableModel。否则,如果您想从头开始创建模型,则可以创建自己的模型,但我不明白这一点。你也有QTableModel的例子。

您不需要为每个表创建模型,因为它始终是一个表模型。该模型主要定义了如何使用特定数据添加和删除行。

关于视图,您必须继承 QTableView 为您的行和列添加自定义行为,例如拖动事件。

您需要的唯一自定义元素是您的视图或列的委托。它基本上会将模型中的布尔值转换为复选框。

我建议您查看SpinBox 委托以获得更精确的信息。

希望这可以帮助。

编辑:

对于 PostgreSQL,您可以将其添加到 QsqlDatabase 中:

 QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
 db.setHostName("acidalia");
 db.setDatabaseName("customdb");
 db.setUserName("mojito");
 db.setPassword("J0a1m8");
 bool ok = db.open();

然后将 db 传递给 QSqlTableModel。如果您需要更多的关系操作,例如从外键获取字段,您可以使用:

QSqlRelationalTableModel
QSqlRelationalDelegate
于 2013-03-20T13:14:58.060 回答
1

你可以用QSqlTableModel这个。

正如文档所说,它可以很容易地使用:

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"));

QTableView *view = new QTableView;
view->setModel(model);
view->hideColumn(0); // don't show the ID
view->show();

我想我需要为每个表创建一个模型类?

是的,一个模型代表一个sql表。

cityTableModel 构造函数会从数据库中的表中获取数据吗?

QSqlTableModel会为你做的:

QSqlTableModel *model = new QSqlTableModel(parentObject, database);
model->setTable("employee");
model->select();

我需要为每个不同的模型子类 QTableView 吗?

不,你没有。单个QTableview可以显示您使用设置的任何模型setModel

Finnaly,我猜 view.setData 和 view.setModel 需要重新实现?setModel 将遍历每个模型行以构建 QTableView,而 setData 将执行适当的查询以在模型中添加新数据?

根据您使用 设置的编辑策略setEditStrategy,更改将在您编辑表格单元格时提交,或者在您使用 提交之后提交submitAll

此外,您可能想看看QDataWidgetMapper. 它可以将您的模型数据映射到不同的小部件,并跟踪您在编辑这些小部件时所做的更改。

于 2013-03-20T13:24:15.537 回答