Qt模型/视图和QTableView的基本概念

时间:2013-03-20 13:00:44

标签: qt model-view-controller qtableview qabstractitemmodel

我想创建一个浏览某些数据库表的软件,用户可以编辑这些表。在我阅读了这篇link之后,我认为该模型/视图是我需要的一个好方法。看看下面的模型: enter image description here

知道这一点,我有疑问,以确保我理解这个概念。请告诉我,如果我的方向很好:

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

    class citiesTableModel : public QAbstractItemModel
     {
         Q_OBJECT
     }
    
  2. citiesTableModel构造函数将从表中获取数据 在数据库中?

    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将进行适当的查询以在中添加新数据 模型?
  5. 非常感谢。

2 个答案:

答案 0 :(得分:3)

基本上你有不同的选择:

您的数据库是SQL数据库。您可以使用子类QSqlTableModel。 否则,如果你想从头创建你的模型,你可以自己做模型,但我没有看到这一点。您还有QTableModel示例。

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

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

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

我建议您查看SpinBox delegate以获得更高的精确度。

希望这有帮助。

编辑:

对于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

答案 1 :(得分: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表。

  

citiesTableModel构造函数将从数据库中的表中获取数据吗?

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。它可以将您的模型数据映射到不同的小部件,并跟踪您正在编辑这些小部件的更改。

相关问题