Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Qt中的另一个tableView中显示QSqlTableModel的过滤数据?_Qt_Filter_Tableview_Show_Qsqltablemodel - Fatal编程技术网

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

如何在Qt中的另一个tableView中显示QSqlTableModel的过滤数据?,qt,filter,tableview,show,qsqltablemodel,Qt,Filter,Tableview,Show,Qsqltablemodel,我使用QSqlTableModel加载了一个数据库,并在tableView1中显示它。现在,我已经为这个QSqlTableModel设置了一个过滤器,并希望在tableView2中显示过滤后的数据tableView1和tableView2不应相互交互。那么,如何展示它,最快的方式是什么 注: 数据库只包含数字,没有字符串,维度不大(约500*5) tableview 2中的数据不需要存储 主要代码如下: QSqlTableModel *model = new QSqlTableModel(NUL

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

注:

  • 数据库只包含数字,没有字符串,维度不大(约500*5)
  • tableview 2中的数据不需要存储
  • 主要代码如下:

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

    我不想将过滤后的数据写入另一个数据库,然后存储、显示。我想找一些更好的方式来展示它。或者,我是否需要提取矩阵中的过滤数据,并在
    表视图中显示该矩阵?有人能提供一些想法吗?谢谢你

    既然你想显示这两个模型,我认为最干净的方法就是在
    tableView2
    中使用一个子类(我称之为
    model2
    ),重写为只接受
    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);
    

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

    是否有任何原因您不能有两个
    QSqlTableModel
    s——每个
    QTableView
    ——一个,但它们都使用相同的
    QSqlDatabase
    实例?@G.M。因为我只想要这个数据库的一个副本。如果我使用两个
    QSqlTableModel
    ,这是对内存的浪费。非常感谢
    QSortFilterProxyModel
    是解决问题的好方法,因为我需要与模型视图同步。再次感谢你。