在Qt中,我想在QTableView的单独类中生成模型

时间:2015-07-25 13:30:10

标签: c++ qt model-view-controller

作为一名C / C#程序员,我是Qt的新手,对C ++没什么经验。

我想要做的是在包含我的数据的类中“制作”QTableView的模型。在C#中,我可以从包含有关此数据的所有内容的类中的静态方法返回DataSet,并将此数据集绑定到我的表或列表。

public class Books
{
   //properties
   ...

   //construtors etc...
   ...

   static DataSet BookData()
   {
       // fill my dataset
       return myDataSet;
   }
} 

在主程序中,我然后将我的DataSet与我想要使用的控件

绑定

有没有办法在Qt / C ++中做同样的事情,这样我就可以这样写:

QSqlTableModel* Books::BookData()
{
    // Create an QSqlTableModel
    // Fill it with my data
    return model; // or whatever is possible
}

在主程序中:

...
    ui->tvBooks->setModel(BookData());
...

这是正确的垃圾清理还是这种一厢情愿的想法......

TNX

2 个答案:

答案 0 :(得分:0)

在Qt中,通常如下所示:

  1. 拥有包含您数据的模型。
  2. 在视图上调用setModel,让视图显示模型中的内容。
  3. Qt有两种通用的模型方法:

    1. 使用具体模型并使用数据填充它。此类模型包括QStringListModelQStandardItemModel以及与数据库接口的模型,例如QSqlTableModel

    2. 创建一个派生自其中一个基本模型类的类,例如QAbstractListModelQAbstractTableModelQAbstractItemModel。重新实现相关的虚拟方法以实现您自己的模型。

    3. 在您的情况下,您可以,例如:

      1. Books班级成员QStandardItemModel,并用它来存储图书数据。不要将数据存储在该模型之外。该类应该将模型暴露给外部,然后您可以在视图上设置它。这将是更简单的方法,因为您不需要自己重新实现模型。

      2. 如果您希望SQL的灵活性可用于访问数据,您还可以使用内存中的SQLITE数据库,并通过QSqlTableModelQSqlQueryModel或{{ 1}}。除此之外,方法如上所述。

      3. (您的回答)有一个返回新创建的静态模型的方法。

      4. QSQLRelationalTableModel类继承Books。这需要你理解Qt模型的语义,并且有点难。

      5. 如果您希望每次数据库内容发生变化时都使用静态模型(例如QAbstractTableModel),您可以轻松利用QSqlQueryModel的复合性。

        要管理模型的生命周期,它可以自动使自己成为视图的子项,并删除任何其他同样也是该视图的子项:

        QObject

答案 1 :(得分:0)

[解决]

我为解决此案做了什么:

class Books
{
   static void* GetBookData(QTableView *model)
   {

    model->setTable("books.books");
    model->select();
    ...

   }
}; 

在图书馆

...
QTableView *view = new QTableView;
...

Books::GetBookData(view);
ui->myCombobox->setModel(view);

...

delete view;

...

在主程序中。