转自 点击打开链接
1,创建数据库文件
//**********************************************************************
// 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宏
2, 主窗口头文件
//**********************************************************************
// 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();
}
效果图: