Qt中如何在另一个tableView中显示QSqlTableModel过滤后的数据?

How to show the filtered data of QSqlTableModel in another tableView in Qt?

我已经使用 QSqlTableModel 加载了一个数据库,并在 tableView1 中显示了它。现在,我已经为此 QSqlTableModel 设置了一个过滤器,并希望在 tableView2 中显示过滤后的数据。 tableView1tableView2 不应相互影响。那么,如何显示,最快的方法是什么?

注:

  1. 数据库只有number没有string,维度也不大(500*5左右);
  2. tableView2中的数据不需要存储

主要代码如下:

QSqlTableModel *model = new QSqlTableModel(NULL, db);
model->setTable(tableName);
model->select();
tableView->setModel(model);
tableView->show();
model->setFilter("colum5 > 10");

我不想把过滤后的数据写到另一个数据库中,然后存储,展示。我想找到一些更好的方式来展示它。或者,我是否需要将过滤后的数据提取到一个矩阵中,并将这个矩阵显示在tableView中?谁能提供一些想法?谢谢

因为你想显示两个模型,我认为最干净的方法是使用 QSortFilterProxyModel subclass (I will refer to it as model2) in tableView2, override filterAcceptsRow() to accept only rows with column5 > 10, and set its source modelmodel1(你原来的 QSqlTableModel)。

这将使两个模型一起同步,对其中任何一个的编辑将自动应用到两个模型。

您的 QSortFilterProxyModel 子类可能如下所示:

class MyFilterModel : public QSortFilterProxyModel{
public:
    explicit MyFilterModel(QObject* parent= nullptr):QSortFilterProxyModel(parent){}
    ~MyFilterModel(){}

    void setCol5Min(int val){
        col5Min= val;
        invalidateFilter();
    }

protected:
    bool filterAcceptsRow(int source_row, const QModelIndex &/*source_parent*/) const{
        //get index using source_row, and the column you want to filter
        QModelIndex index4= sourceModel()->index(source_row, 4);
        //accept the row only when col5's value is greater than col5Min
        return (sourceModel()->data(index4).toInt() > col5Min);
    }
private:
    int col5Min;
};

你可以这样使用它:

QSqlTableModel *model1 = new QSqlTableModel(this, db);
model1->setTable(tableName);
model1->select();
tableView1->setModel(model1);

MyFilterModel* model2= new MyFilterModel(this);
model2->setCol5Min(10);
model2->setSourceModel(&model1);
tableView2->setModel(model2);

上述方法的唯一缺点是过滤不在数据库中执行(它在您的应用程序代码中完成),因此您不能利用任何例如,您可能在 col5 上拥有索引(但如果您有 500 行,这根本不是问题)。

如果要在数据库中执行过滤,则必须使用两个单独的 QSqlTableModels:

QSqlTableModel *model1 = new QSqlTableModel(this, db);
model1->setTable(tableName);
model1->select();
tableView1->setModel(model1);

QSqlTableModel *model2 = new QSqlTableModel(this, db);
model2->setTable(tableName);
model2->setFilter("colum5 > 10");
model2->select();
tableView2->setModel(model2);

但这不会使您的 table 视图同步。当用户编辑 table 视图之一时,您将必须更新另一个视图。