用QT写了一个小工具,主要是对Excel中大量的数据进行计算和显示。

写了有一段时间,然后断断续续的做一些修改和完善。

因为要显示的数据有多列,很自然的会想到要能够对显示的数据进行排序。如果直接操作model里的数据,不太方便,因为最好是能由用户自己选择按哪一列进行排序。如果通过信号槽机制,也不是很方便。然后找到QTableView下有一个setSortingEnabled()的函数。在将该函数设置为True后,在鼠标移动到表头上某一列时,可以看到出现了可以用于提示点击的上三角或下三角标志,但是,在鼠标点击过后没有任何反应。本人以为上述函数被设置为True后,还要对每一列的排序用代码实现,想想就发怵,作罢。后来继续研究,说是可以通过信号槽,先获取鼠标点击表头的信号,然后映射到一个sortByColumn()的排序槽函数上,用于排序。因为本人对信号槽也只是入门,编写起来发现也有一些问题不好解决。最后在中文网上几乎找不到好的解决办法,关键是并没有相关度很高的内容。于是,就试着用了一下google。一会就找到了好几个类似的问题,网友也提出了几种解决方案。

首先说一下原因:

将setSortingEnabled()函数设为True后,点击表头排序的背后调用的是sortByColumn()这个函数。

在qtableview.cpp源文件中有sortByColumn()函数的实现代码:

 void QTableView::sortByColumn(int column)
{
Q_D(QTableView); if (!d->model)
return;
bool ascending = (horizontalHeader()->sortIndicatorSection()==column&& horizontalHeader()->sortIndicatorOrder()==Qt::DescendingOrder);
Qt::SortOrder order = ascending ? Qt::AscendingOrder : Qt::DescendingOrder;
horizontalHeader()->setSortIndicator(column, order);
d->model->sort(column, order);
}

sortByColumn()函数最后调用的model的sort函数。

由于本人使用的model类型是QSqlQueryModel,该类型继承自QAbstractTableModel类,而该类又继承自QAbstractItemModel。

QSqlQueryModel和QAbstractTableModel这两个类本身是没有sort函数的,自能使用QAbstractItemModel类的sort函数。

QAbstractItemModel类中的sort函数形式如下:

virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder)

它是一个虚拟函数,也就是说没有具体的实现,是无法真正用于排序的。

所以由此产生一个思路,如果将model的类型转换成一个重写了sort函数的model类,那么也许就可以通过点击表头进行排序了。

找一下QAbstractItemModel有哪些子类,通过一番搜索,找到QAbstractProxyModel、QSqlTableModel等子类都有重写的sort函数。

我们把之前QSqlQueryModel的model转换为QAbstractProxyModel试一下,看是否有效。

 QSqlDatabase db_output1 = QSqlDatabase::database("db_output1_connection");
QSqlQueryModel *model = new QSqlQueryModel();
QString model_query;
model_query = QString("Select Airline ,Airline1, Ratio, Angle, Year, Summer, Winter from [%1$]").arg(show_sheet_name);
model->setQuery(model_query,db_output1);
QSortFilterProxyModel *sqlproxy = new QSortFilterProxyModel(this);
sqlproxy->setSourceModel(model);
ui->tableView->setModel(sqlproxy);

这是没有排序时,显示的结果。

下图是单击表头中的日班次后排序的结果。

下图是单击另一列的表头(费率)后排序的结果。其他各列的排序也均有效。

QSqlTableModel等其他的类本人没测试。按道理来说,应该也是有效的。

QT中Qtableview视图表格中点击表头进行排序的更多相关文章

  1. Switch开关在element-ui表格中点击没有效果解决方法

    <el-table-column label="三审" align="center"> <template slot-scope=" ...

  2. PyQt(Python+Qt)学习随笔:model/view架构中QTableView视图的数据无法显示问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在使用QTableView来显示如下数据时: 在model中插入数据是使用如下类似代码: for c ...

  3. PyQt(Python+Qt)学习随笔:model/view架构中QTableView视图的标题显示不正常问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在进行QTableView展示数据时,使用了QStandardItemModel的model,并在将 ...

  4. Maven问题总结:Eclipse中项目右键菜单中点击Maven->Update Projects时JDK被重置

    Eclipse中在项目右键菜单点击->Maven->Update Projects时,JDK总是切回 1.5 如果没有在Maven中配置过JDK版本,只是在Eclipse中项目的Prope ...

  5. jquery实现表格中点击相应行变色功能

    对于一个表格,为了使我们选中的项更容易区分,需要为选中项添加高亮,同时也需要,将其他项的高亮形式去除.类似于: <!DOCTYPE html> <html lang="en ...

  6. 关于table表格中点击一个按钮获取该行的某一列的值并将其传到模态框的问题解决

    <tbody> {% for item in all_dataset %} <tr> <td>{{ item.nid }}</td> <td> ...

  7. WPF中的DataGridTemplateColumn实现点击列标题排序

    在DataGrid中使用模板列时,默认功能中对点击列标题是不对列值进行排序的,要排序就需要添加以下两个属性: 1.CanUserSort="True" 2.SortMemberPa ...

  8. [Qt基础内容-08] Qt中MVC的M(Model)

    Qt中MVC的M(Model)简单介绍 Qt有自己的MVC框架,分别是model(模型).view(视图).delegate(委托),这篇文章,简单的介绍以下Qt中有关model(模型)的类以及一些基 ...

  9. easyUI中点击datagrid列标题排序

    easyUI中点击datagrid的排序有两种,一种是本地的,一种是服务器的.本地的只能排序当前页,而服务器的可以对全部页进行排序.这里主要是分享下服务器排序. 1.为datagrid添加属性remo ...

随机推荐

  1. windows AD域安装及必要设置

    一.安装AD域 运行dcpromo命令,安装AD域. 步骤: 1.win+R 2.dcpromo 图例: 百度百科关于“dcpromo”解释: dcpromo命令是一个“开关”命令.如果Windows ...

  2. 使用C++11实现一个半同步半异步线程池

    前言 C++11之前我们使用线程需要系统提供API.posix线程库或者使用boost提供的线程库,C++11后就加入了跨平台的线程类std::thread,线程同步相关类std::mutex.std ...

  3. GIT使用—分支与合并

    一.分支名 分支名不能以斜线结尾 分支名不能以减号开头 以斜杠分割的组件不能以点开头(feature/.new) 分支名的任何地方都不能包含连个连续的点 分支名不能包含空格或空白符 分支名不能包含波浪 ...

  4. Vue组件里面data为什么必须是个函数

    在创建或注册模板的时候,传入一个data属性用来绑定数据,但是在组件中,data必须是一个函数,而不能直接把对象赋值给它. export default { name:'app', data(){ r ...

  5. 20145103JAVA第二次实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  6. 20145321 《Java程序设计》第7周学习总结

    20145321 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 时间与日期 13.1 认识时间与日期 1.格林威治时间(GMT) 观察太阳得来 2.世界时(UT) 3.国 ...

  7. @component的注解

    1.@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spr ...

  8. Hive-0.13安装

    Hive只需在使用节点安装即可. 1.上传tar包.解压   tar -zxvf apache-hive-0.13.0-bin.tar.gz -C /hadoop/  配置HIVE_HOME环境变量  ...

  9. ContOs 将SpringBoot的jar制作成系统服务

    将jar包上传到  你想要的目录下 如 /java/service/demo.jar 进入 /etc/systemd/system 目录下 新建  demo.service 内容如下 -------- ...

  10. java和groovy的混用

    java在语言的动态性方便不是很灵活,如果你想快速增加或改变一些方法,那么只能通过反射机制,并且参数传递的格式很严格. 相比之下,基于groovy可以快速写出一些自定义方法,并能和java很好结合,类 ...