QSqlTableModel设置字段显示顺序,实现自定义排序与显示
有问题待完善!!!!!!!
需求明确
在做一个数据库模块时,遇到要用户要对显示进行自定义操作,也就是在QSqltablemodel绑定tableview后,不按照默认的字段显示
用过QSqltablemodel的应该都知道,比较方便,但是问题就是没有提供字段显示修改的接口,然后开始我们自定义QSqltablemodel来实现此功能
QSqlTableModel简介与使用方法
查询设置:
//查询:
model = new QSqlTableModel(this);
model->setTable(“student”);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); //选取整个表的所有行
ui->tb_ElementHisData->setModel(model);
条件查询:
//条件:(等价于SQL语句的where)
model->setFilter("order by time desc"); //根据姓名进行筛选
model->select(); //显示结果
排序查询:
排序:(等价于ORDERBY)
model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列
model->select();
model->setSort(0,Qt::DescendingOrder); //id属性,即第0列,降序排
model->select();
这些网上都有写,不详细说明了
具体实现
要实现自定义的Qsqltablemodel,首先要找到他所调用显示的接口
QString selectStatement() const
找到具体接口后,我们根据接口具体实现,来重写该接口
代码实现:
class LogModel : public QSqlTableModel
{
public:
LogModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase()):QSqlTableModel(parent, db)
{
}
void setSelectSort(QString str)
{
m_SelectSort = str;
}
protected:
QString selectStatement() const
{
//返回需要显示的字段和设置字段顺序
return m_SelectSort;
}
QString m_SelectSort;
};
class b
{
LogModel *model;
}
model = new LogModel(ui->tb_ElementHisData, m_GlobalVar.m_HisDataDb->getDatabase()); //初始化表格模型
QString str = "SELECT \"";
for (int i = 0; i <table_key.size();i++)
{
str+=table_key.at(i)+"\",\"";
}
str.chop(2);
str+=" FROM HisElementData";
qDebug()<<str;
model->setSelectSort(str);```
model->select();
ui->tb_ElementHisData->setModel(model);
这里的 \ "是为了转义成” “, 因为我的字段名字带有了As ,In与数据库关键字有冲突,所以做了特殊处理,详情请看我另外一篇文章。
在这里我们每次显示只需要修改table_key里的字段顺序,就可以进行排序显示,每次记得清空表头记得表头对应!chop(2)是为了去除最后的, ” 有什么不理解的可以在下方评论