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

时间:2016-10-24 00:15:16

标签: qt filter tableview show qsqltablemodel

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

注意:

  1. 数据库只包含不带字符串的数字,且维度不大(约500 * 5);
  2. 不需要存储tableView2中的数据。
  3. 主要代码如下:

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

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

1 个答案:

答案 0 :(得分:2)

由于你想要显示两个模型,我认为最简洁的方法就是在{{1}中使用QSortFilterProxyModel子类(我将其称为model2) },覆盖filterAcceptsRow()仅接受tableView2行,并将其source model设置为column5 > 10(原始model1)。

这将使两个模型同步,任何一个模型的编辑将自动应用于两个模型。

以下是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); 为例(但如果你有500行,这根本不是问题)。

如果您希望在数据库中执行过滤,则必须使用两个单独的col5

QSqlTableModel

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