• 6867阅读
  • 1回复

[提问]QSqlQueryModel 配合Qtableview的表格,怎么实现点击头部排序? [复制链接]

上一主题 下一主题
离线蜗牛a灬
 

只看楼主 倒序阅读 楼主  发表于: 2014-06-10
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include<QScrollBar>
  4. #include<QSqlQuery>
  5. #include<QDebug>
  6. static int nCurScroller=0;//翻页时的当时滑动条位置
  7. static int pageValue = 10;// 一页显示条数
  8. static QString sqlList="select [name],[country],[schools] from t_UserCheck";
  9. static int orderNum=1;
  10. MainWindow::MainWindow(QWidget *parent) :
  11.     QMainWindow(parent),
  12.     ui(new Ui::MainWindow)
  13. {
  14.     ui->setupUi(this);
  15.     ui->view->setSortingEnabled(true);
  16.     QHeaderView *headerGoods= ui->view->horizontalHeader();
  17.     headerGoods->setSortIndicator(0,Qt::AscendingOrder);
  18.     headerGoods->setSortIndicatorShown(true);
  19.     //headerGoods->setClickable(true);
  20.     connect(headerGoods, SIGNAL(sectionClicked(int)),this, SLOT(orderButton(int)));
  21.     ui->view->setSelectionMode(QAbstractItemView::SingleSelection);
  22.     ui->view->setSelectionBehavior(QAbstractItemView::SelectRows);
  23.     if(!CreateData())
  24.     {
  25.         QMessageBox::information(this, tr("提示"), tr("Sql Server数据库连接失败!"), tr("确定"));
  26.         ui->Button_consql->setEnabled(true);
  27.     }
  28.     else
  29.     {
  30.         ui->Button_consql->setText(tr("数据库已连接!"));
  31.         ui->Button_consql->setEnabled(false);
  32.         initNum();
  33.     }
  34. }
  35. MainWindow::~MainWindow()
  36. {
  37.     delete ui;
  38. }
  39. bool  MainWindow::CreateData()
  40. {
  41.       db=QSqlDatabase::addDatabase("QODBC");
  42.       // 注意,对于express版本数据库, 一定要加\\sqlexpress这种后缀
  43.       //本地数据库
  44.     QString dsn="DRIVER={SQL SERVER};SERVER=localhost;DATABASE=Zp_DateSoce";
  45.       db.setDatabaseName(dsn);
  46.       db.setUserName("sa");
  47.       db.setPassword("123456");
  48.       if(!db.open())
  49.       {
  50.           qDebug("Error:%s",qPrintable(db.lastError().text()));
  51.           return false;
  52.       }
  53.       model = new QSqlQueryModel;
  54.       QString tableSql=sqlList;
  55.       model->setQuery(tableSql);
  56.       initTable();
  57.       return true;
  58. }
  59. void MainWindow::initTable()
  60. {
  61.      model->setHeaderData(0, Qt::Horizontal, tr("姓名"));
  62.      model->setHeaderData(1, Qt::Horizontal, tr("国家"));
  63.      model->setHeaderData(2, Qt::Horizontal, tr("院校"));
  64.      ui->view->setModel(model);
  65.      ui->view->show();
  66. }
  67. void MainWindow::initNum()  //显示总行数
  68. {
  69.      while(model->canFetchMore())
  70.      model->fetchMore();
  71.      int num=model->rowCount();
  72.      QString snum = QString::number(num, 10);
  73.      ui->label_num->setText(snum);
  74. }
  75. void MainWindow::on_Button_consql_clicked()
  76. {
  77.      if(!CreateData())
  78.      {
  79.          QMessageBox::information(this, tr("提示"), tr("Sql Server数据库连接失败!"), tr("确定"));
  80.          ui->Button_consql->setEnabled(true);
  81.      }
  82.      else
  83.      {
  84.          ui->Button_consql->setText(tr("数据库已连接!"));
  85.          initNum();
  86.      }
  87. }
  88. void MainWindow::on_preButton_clicked()  //下一页
  89. {
  90.     int maxValue = ui->view->verticalScrollBar()->maximum();// 当前SCROLLER最大显示值25
  91.      nCurScroller = ui->view->verticalScrollBar()->value();
  92.      if(nCurScroller>0)
  93.          ui->view->verticalScrollBar()->setSliderPosition(nCurScroller-pageValue);
  94.      else
  95.          ui->view->verticalScrollBar()->setSliderPosition(maxValue);
  96. }
  97. void MainWindow::on_nextButton_clicked() //上一页
  98. {
  99.     int maxValue = ui->view->verticalScrollBar()->maximum();// 当前SCROLLER最大显示值25
  100.     nCurScroller = ui->view->verticalScrollBar()->value();//获得当前scroller值
  101.     if(nCurScroller<maxValue)
  102.         ui->view->verticalScrollBar()->setSliderPosition(pageValue+nCurScroller);
  103.     else
  104.         ui->view->verticalScrollBar()->setSliderPosition(0);
  105. }
  106. void MainWindow::on_pushButton_clicked()  //查询
  107. {
  108.     QString search_name=ui->lineEdit_name->text();
  109.     QString search_country=ui->lineEdit_country->text();
  110.     QString search_school=ui->lineEdit_school->text();
  111.     QString search_subject=ui->lineEdit_subject->text();
  112.     if(search_name==NULL&&search_school==NULL&&search_country==NULL&&search_subject==NULL)
  113.     {
  114.          QMessageBox::information(this, tr("提示"), tr("请输入搜索条件!"), tr("确定"));
  115.     }
  116.     else
  117.     {
  118.         QString sqlQuery=sqlList+" where 1=1";
  119.         if(search_country!=NULL)
  120.         {
  121.             sqlQuery=sqlQuery+" and "+QObject::tr("country like '%1'").arg(QString("%")+=search_country+=QString("%"));// 根据留学国家进行筛选
  122.         }
  123.         if(search_school!=NULL)
  124.         {
  125.             sqlQuery=sqlQuery+" and "+QObject::tr("schools like '%1'").arg(QString("%")+=search_school+=QString("%"));// 根据学校进行筛选
  126.         }
  127.         if(search_subject!=NULL)
  128.         {
  129.              sqlQuery=sqlQuery+" and "+QObject::tr("subject like '%1'").arg(QString("%")+=search_subject+=QString("%"));// 根据专业进行筛选
  130.         }
  131.         if(search_name!=NULL)
  132.         {
  133.             sqlQuery=sqlQuery+" and "+QObject::tr("backbroad like '%1'").arg(QString("%")+=search_name+=QString("%")); // 根据名字进行筛选 改为回国时间
  134.         }
  135.         //qDebug()<<sqlQuery;
  136.         model->setQuery(sqlQuery);
  137.         initTable();
  138.         initNum();
  139.     }
  140. }
  141. void MainWindow::on_lineEdit_country_editingFinished()
  142. {
  143.     //ui->lineEdit_subject->setFocus();
  144. }
  145. void MainWindow::on_lineEdit_subject_editingFinished()
  146. {
  147.     //ui->lineEdit_name->setFocus();
  148. }
  149. void MainWindow::on_lineEdit_school_editingFinished()
  150. {
  151. }
  152. void MainWindow::on_lineEdit_name_editingFinished()  //Enter键响应
  153. {
  154.     on_pushButton_clicked();
  155. }
  156. void MainWindow::on_pushButton_2_clicked()  //重置按钮
  157. {
  158.     ui->lineEdit_name->clear();
  159.     ui->lineEdit_country->clear();
  160.     ui->lineEdit_school->clear();
  161.     ui->lineEdit_subject->clear();
  162.     QString tableSql=sqlList;
  163.     model->setQuery(tableSql);
  164.     initTable();     //这样才能再次显示整个表的内容
  165.     initNum();
  166. }
  167. void MainWindow::orderButton(int num)
  168. {
  169.     qDebug()<<orderNum;
  170.     if(orderNum==100) orderNum=0;
  171.     if(orderNum%2==1)
  172.     {
  173.         ui->view->sortByColumn(num,Qt::AscendingOrder);
  174.         //model->sort(num,Qt::AscendingOrder);
  175.         orderNum++;
  176.         qDebug()<<"AscendingOrder"<<num<<sqlList;
  177.     }
  178.     else
  179.     {
  180.         ui->view->sortByColumn(num,Qt::DescendingOrder);
  181.        // model->sort(num,Qt::DescendingOrder);
  182.         orderNum++;
  183.         qDebug()<<"DescendingOrder"<<num;
  184.     }
  185. }

用下面两个都试了试,都实现不了排序
  1. ui->view->sortByColumn(num,Qt::DescendingOrder);
  2.   model->sort(num,Qt::DescendingOrder);

请问该怎么才能点击表格的头部进行排序呢?

离线alexltr

只看该作者 1楼 发表于: 2014-06-10
用QSqlQueryModel好像不可以. 用QSqlTableModel或结合QSortFilterProxyModel使用看一下行不行.

或者你要重新实现model的sort()函数。


我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
快速回复
限100 字节
 
上一个 下一个