简单实现QT4数据库分页查询

创建数据库表的文件

//**********************************************************************
// Copyright (c) 2011
// 迪斯特软件开发小组.
// 文件: database.h
// 内容: 
// 历史:
//	序号	修改时间		修改人		修改内容
//	1	2011-11-17	Administrator	首次生成
//*********************************************************************

//声明本头文件宏    
#ifndef _DATABASE_H
#define _DATABASE_H

//包含头文件
#include <QSqlDatabase>
#include <QSqlQuery>

//**********************************************************************
// 函数: createDatabase
// 功能: 创建数据库
//*********************************************************************
static bool createDatabase()
{
  //添加数据
  QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
  //设置数据库名称
  database.setDatabaseName("database.db");
  //判断是否打开
  if(!database.open())
    //返回
    return false;
  //声明数据库查询对象
  QSqlQuery query;
  //创建表
  query.exec("create table student(id int primary key, name vchar, sex vchar, age int, deparment vchar)");
  //添加记录
  query.exec("insert into student values(1,'张三1','男',20,'计算机')");
  query.exec("insert into student values(2,'李四1','男',19,'经管')");
  query.exec("insert into student values(3,'王五1','男',22,'机械')");
  query.exec("insert into student values(4,'赵六1','男',21,'法律')");
  query.exec("insert into student values(5,'小明1','男',20,'英语')");
  query.exec("insert into student values(6,'小李1','女',19,'计算机')");
  query.exec("insert into student values(7,'小张1','男',20,'机械')");
  query.exec("insert into student values(8,'小刚1','男',19,'经管')");
  query.exec("insert into student values(9,'张三2','男',21,'计算机')");
  query.exec("insert into student values(10,'张三3','女',20,'法律')");
  query.exec("insert into student values(11,'王五2','男',19,'经管')");
  query.exec("insert into student values(12,'张三4','男',20,'计算机')");
  query.exec("insert into student values(13,'小李2','男',20,'机械')");
  query.exec("insert into student values(14,'李四2','女',19,'经管')");
  query.exec("insert into student values(15,'赵六3','男',21,'英语')");
  query.exec("insert into student values(16,'李四2','男',19,'法律')");
  query.exec("insert into student values(17,'小张2','女',22,'经管')");
  query.exec("insert into student values(18,'李四3','男',21,'英语')");
  query.exec("insert into student values(19,'小李3','女',19,'法律')");
  query.exec("insert into student values(20,'王五3','女',20,'机械')");
  query.exec("insert into student values(21,'张三4','男',22,'计算机')");
  query.exec("insert into student values(22,'小李2','男',20,'法律')");
  query.exec("insert into student values(23,'张三5','男',19,'经管')");
  query.exec("insert into student values(24,'小张3','女',20,'计算机')");
  query.exec("insert into student values(25,'李四4','男',22,'英语')");
  query.exec("insert into student values(26,'赵六2','男',20,'机械')");
  query.exec("insert into student values(27,'小李3','女',19,'英语')");
  query.exec("insert into student values(28,'王五4','男',21,'经管')");
  //返回
  return true;
}

#endif //假如未定义_DATABASE_H宏

 主窗口头文件

//**********************************************************************
// Copyright (c) 2011
// 迪斯特软件开发小组.
// 文件: mainwindow.h
// 内容: 
// 历史:
//	序号	修改时间		修改人		修改内容
//	1	2011-11-17	Administrator	首次生成
//*********************************************************************

//声明本头文件宏    
#ifndef _MAINWINDOW_H
#define _MAINWINDOW_H

//包含头文件
#include <QWidget>
//类前向声明
class QTableView;
class QSqlQueryModel;
class QLabel;
class QLineEdit;
class QPushButton;

//**********************************************************************
// 类名:  MyMainWindow
// 目的:  自定义窗口类
//*********************************************************************
class MyMainWindow : public QWidget
{
  //宏声明
  Q_OBJECT

//成员函数
public:
  //构造函数
  MyMainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
  //析构函数
  ~MyMainWindow();

//私有槽函数
private slots:
  void OnPrevButtonClick();      //前一页按钮按下
  void OnNextButtonClick();      //后一页按钮按下
  void OnSwitchPageButtonClick();  //转到页按钮按下

//私有成员函数
private:
  void CreateWindow();        //创建窗口
  void SetTableView();        //设置表格
  int  GetTotalRecordCount();    //得到记录数
  int  GetPageCount();        //得到页数
  void RecordQuery(int limitIndex);	//记录查询
  void UpdateStatus();    	//刷新状态
  void SetTotalPageLabel();	//设置总数页文本

//成员变量
private:
  QSqlQueryModel	*queryModel;      //查询模型
  QTableView	*tableView;      //数据表
  QLabel	*totalPageLabel;   //总数页文本
  QLabel	*currentPageLabel;	  //当前页文本
  QLineEdit	*switchPageLineEdit; //转到页输入框
  QPushButton	*prevButton;	  //前一页按钮
  QPushButton	*nextButton;	  //下一页按钮
  QPushButton	*switchPageButton;	  //转到页按钮
  int		currentPage;	  //当前页
  int		totalPage;	  //总页数
  int		totalRecrodCount;	  //总记录数
  enum		{PageRecordCount = 5};//每页显示记录数
};

#endif //假如未定义_MAINWINDOW_H宏

 主窗口源文件

//**********************************************************************
// Copyright (c) 2011
// 迪斯特软件开发小组.
// 文件: mainwindow.cpp
// 内容: 
// 历史:
//	序号	修改时间		修改人		修改内容
//	1	2011-11-17	Administrator	首次生成
//*********************************************************************

//包含头文件
#include <QtGui>
#include <QRegExp>
#include <QSqlQueryModel>
#include "mainwindow.h"

//**********************************************************************
// 函数: MyMainWindow
// 功能: 构造函数
//*********************************************************************
MyMainWindow::MyMainWindow(QWidget *parent, Qt::WFlags flags) : QWidget(parent, flags)
{
  //设置窗口属性
  setMinimumSize(600,300);
  setWindowTitle("分页查询示例");
  //创建窗口
  CreateWindow();
  //设置表格
  SetTableView();
  //信号槽连接
  connect(prevButton,SIGNAL(clicked()),this,SLOT(OnPrevButtonClick()));
  connect(nextButton,SIGNAL(clicked()),this,SLOT(OnNextButtonClick()));
  connect(switchPageButton,SIGNAL(clicked()),this,SLOT(OnSwitchPageButtonClick()));
}

//**********************************************************************
// 函数: ~MyMainWindow
// 功能: 析构函数
//*********************************************************************
MyMainWindow::~MyMainWindow()
{
}

//**********************************************************************
// 函数: CreateWindow
// 功能: 创建窗口
//*********************************************************************
void MyMainWindow::CreateWindow()
{
  //操作布局
  QHBoxLayout *operatorLayout = new QHBoxLayout;
  prevButton = new QPushButton("前一页");
  nextButton = new QPushButton("下一页");
  switchPageButton = new QPushButton("Go");
  switchPageLineEdit = new QLineEdit;
  switchPageLineEdit->setFixedWidth(40);
  QLabel *switchPage = new QLabel("转到第");
  QLabel *page = new QLabel("页");
  operatorLayout->addWidget(prevButton);
  operatorLayout->addWidget(nextButton);
  operatorLayout->addWidget(switchPage);
  operatorLayout->addWidget(switchPageLineEdit);
  operatorLayout->addWidget(page);
  operatorLayout->addWidget(switchPageButton);
  operatorLayout->addWidget(new QSplitter());
  //状态布局
  QHBoxLayout *statusLayout = new QHBoxLayout;
  totalPageLabel = new QLabel;
  totalPageLabel->setFixedWidth(70);
  currentPageLabel = new QLabel;
  currentPageLabel->setFixedWidth(70);
  statusLayout->addWidget(totalPageLabel);
  statusLayout->addWidget(currentPageLabel);
  statusLayout->addWidget(new QSplitter());
  //设置表格属性
  tableView = new QTableView;
  tableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
  tableView->verticalHeader()->setResizeMode(QHeaderView::Stretch);
  //创建界面
  QVBoxLayout *mainLayout = new QVBoxLayout(this);
  mainLayout->addLayout(operatorLayout);
  mainLayout->addWidget(tableView);
  mainLayout->addLayout(statusLayout);
}

//**********************************************************************
// 函数: SetTableView
// 功能: 设置表格
//*********************************************************************
void MyMainWindow::SetTableView()
{
  //声明查询模型
  queryModel = new QSqlQueryModel(this);
  //设置当前页
  currentPage = 1;
  //得到总记录数
  totalRecrodCount = GetTotalRecordCount();
  //得到总页数
  totalPage = GetPageCount();
  //刷新状态
  UpdateStatus();
  //设置总页数文本
  SetTotalPageLabel();
  //记录查询
  RecordQuery(0);
  //设置模型
  tableView->setModel(queryModel);
  //设置表格表头
  queryModel->setHeaderData(0,Qt::Horizontal,"编号");	
  queryModel->setHeaderData(1,Qt::Horizontal,"姓名");
  queryModel->setHeaderData(2,Qt::Horizontal,"性别");
  queryModel->setHeaderData(3,Qt::Horizontal,"年龄");
  queryModel->setHeaderData(4,Qt::Horizontal,"院系");
}

//**********************************************************************
// 函数: GetTotalRecordCount
// 功能: 得到记录数
//*********************************************************************
int MyMainWindow::GetTotalRecordCount()
{
  queryModel->setQuery("select * from student");
  return queryModel->rowCount();
}

//**********************************************************************
// 函数: GetPageCount
// 功能: 得到页数
//*********************************************************************
int MyMainWindow::GetPageCount()
{
  return (totalRecrodCount % PageRecordCount == 0) ? (totalRecrodCount / PageRecordCount) : (totalRecrodCount / PageRecordCount + 1);
}

//**********************************************************************
// 函数: RecordQuery
// 功能: 记录查询
//*********************************************************************
void MyMainWindow::RecordQuery(int limitIndex)
{
  QString szQuery = QString("select * from student limit %1,%2").arg(QString::number(limitIndex)).arg(QString::number(PageRecordCount));
  queryModel->setQuery(szQuery);
}

//**********************************************************************
// 函数: UpdateStatus
// 功能: 刷新状态
//*********************************************************************
void MyMainWindow::UpdateStatus()
{
  //设置当前页文本
  QString szCurrentText = QString("当前第%1页").arg(QString::number(currentPage));
  currentPageLabel->setText(szCurrentText);
  //设置按钮是否可用
  if(currentPage == 1)
  {
    prevButton->setEnabled(false);
    nextButton->setEnabled(true);
  }
  else if(currentPage == totalPage)
  {
    prevButton->setEnabled(true);
    nextButton->setEnabled(false);
  }
  else
  {
    prevButton->setEnabled(true);
    nextButton->setEnabled(true);
  }
}

//**********************************************************************
// 函数: SetTotalPageLabel
// 功能: 设置总数页文本
//*********************************************************************
void MyMainWindow::SetTotalPageLabel()
{
  QString szPageCountText = QString("总共%1页").arg(QString::number(totalPage));
  totalPageLabel->setText(szPageCountText);
}

//**********************************************************************
// 函数: OnPrevButtonClick
// 功能: 前一页按钮按下
//*********************************************************************
void MyMainWindow::OnPrevButtonClick()
{
  int limitIndex = (currentPage - 2) * PageRecordCount;
  RecordQuery(limitIndex);
  currentPage -= 1;
  UpdateStatus();
}

//**********************************************************************
// 函数: OnNextButtonClick
// 功能: 后一页按钮按下
//*********************************************************************
void MyMainWindow::OnNextButtonClick()
{
  int limitIndex = currentPage * PageRecordCount;
  RecordQuery(limitIndex);
  currentPage += 1;
  UpdateStatus();
}

//**********************************************************************
// 函数: OnSwitchPageButtonClick
// 功能: 转到页按钮按下
//*********************************************************************
void MyMainWindow::OnSwitchPageButtonClick()
{
  //得到输入字符串
  QString szText = switchPageLineEdit->text();
  //数字正则表达式
  QRegExp regExp("-?[0-9]*");
  //判断是否为数字
  if(!regExp.exactMatch(szText))
  {
    QMessageBox::information(this, tr("提示"), tr("请输入数字"));
       return;
  }
  //是否为空
  if(szText.isEmpty())
  {
    QMessageBox::information(this, tr("提示"), tr("请输入跳转页面"));
       return;
  }
  //得到页数
  int pageIndex = szText.toInt();
  //判断是否有指定页
  if(pageIndex > totalPage || pageIndex < 1)
  {
    QMessageBox::information(this, tr("提示"), tr("没有指定的页面,请重新输入"));
       return;
  }
  //得到查询起始行号
  int limitIndex = (pageIndex-1) * PageRecordCount;
  //记录查询
  RecordQuery(limitIndex);
  //设置当前页
  currentPage = pageIndex;
  //刷新状态
  UpdateStatus();
}

 

 主函数源文件

//**********************************************************************
// Copyright (c) 2011
// 迪斯特软件开发小组.
// 文件: main.cpp
// 内容: 
// 历史:
//	序号	修改时间		修改人		修改内容
//	1	2011-11-17	Administrator	首次生成
//*********************************************************************

//包含头文件
#include <QTextCodec>
#include <QApplication>
#include "database.h"
#include "mainwindow.h"

//**********************************************************************
// 函数: main
// 功能: 主函数
//*********************************************************************
int main(int argc, char *argv[])
{
  //声明应用程序变量
  QApplication app(argc, argv);
  //设置中文显示
  QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
  //创建数据库
  if(!createDatabase())
    //返回
    return 1;
  //创建窗口
  MyMainWindow window;
  //显示窗口
  window.show();
  //返回
  return app.exec();
}

 

 运行效果如下

posted on 2011-11-17 15:57  会说话的哑巴  阅读(10896)  评论(1编辑  收藏  举报