如何在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
不应相互交互。那么,如何展示它,最快的方式是什么
注:
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
是解决问题的好方法,因为我需要与模型视图同步。再次感谢你。