2

我已经通过使用加载了一个数据库QSqlTableModel,并将其显示在tableView1. 现在,我已经为此设置了一个过滤器QSqlTableModel,并希望在tableView2. tableView1并且tableView2不应该相互影响。那么,如何展示,最快的方式是什么?

笔记:

  1. 数据库只有数字没有字符串,维度不大(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?谁能提供一些想法?谢谢

4

1 回答 1

3

由于您想显示这两个模型,我认为最简洁的方法是在 中使用QSortFilterProxyModel子类(我将其称为model2tableView2,覆盖filterAcceptsRow()以仅接受带有 的行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);

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

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

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

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

于 2016-10-24T12:07:31.567 回答