qt mysql分页显示_qt 数据库查询结构的分页显示
QT界面中实现数据库查询结果的分页显示
昨天做的,今天整理了下。
目前所使用的数据库依然是MySQL。为了便于管理数据量,我们设置了为固定显示条数,并通过SQL语句中的limit属性进行控制的方式获取所需数据范围。在网页界面中提供了若干功能按钮供用户操作:包括上一个页面、当前页面以及转到第X个页面等选项。实际上其核心实现原理基本一致。值得注意的是,在处理大量数据时 MySQL 数据库的表现可能会出现瓶颈现象
以下是截图:
程序刚运行出来的时候:

点击下一页到尾页:

转到第X页:

代码:
头文件:
#ifndef DIVIDPAGE_H
#define DIVIDPAGE_H
#include #include "ui_dividpage.h"
#include using namespace std;
namespace sql
{
class Connection;
class ResultSet;
namespace mysql
{
class MySQL_Driver;
}
}
class DividPage : public QMainWindow
{
Q_OBJECT
public:
DividPage(QWidget *parent = 0, Qt::WFlags flags = 0);
~DividPage();
函数doConnection返回整数值,并接受以下参数:dbAddr被赋值为localhost地址;userName设为root账户;密码设为870618;dbName指定为mlcndbv2
int tableRowsNum();
void setTableItem();
int getSumPageNum();
private:
Ui::DividPageClass ui;
sql::Connection * m_Connnection;
sql::mysql::MySQL_Driver *m_SqlDriver;
QVector> doquery(int pageNum);
int currentPageNum,sumTableNum,sumPageNum;
QVector> vec;
private slots:
void on_pushButton_3_clicked();
void on_pushButton_2_clicked();
void on_pushButton_clicked();
void on_tableWidget_clicked(const QModelIndex &);
};
#endif // DIVIDPAGE_H
CPP文件:
#include "dividpage.h"
#include #include "mysqlconnector/mysql_connection.h"
#include "mysqlconnector/mysql_driver.h"
#include "mysqlconnector/cppconn/statement.h"
#include "mysqlconnector/cppconn/prepared_statement.h"
#include "mysqlconnector/cppconn/resultset.h"
#include "mysqlconnector/cppconn/resultset_metadata.h"
该程序使用了多个包含文件,并定义了一个名为DividPage的类(使用了多个包含文件)。该类具有成员函数或成员变量:使用了多个包含文件。
: QMainWindow(parent, flags)
{
ui.setupUi(this);
//设置中文编码方式
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
ui.tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
ui.tableWidget->verticalHeader()->setResizeMode(QHeaderView::Stretch);
sumTableNum = tableRowsNum();
sumPageNum = getSumPageNum();
QString labelText = QString("总共%1页").arg(QString::number(sumPageNum));
//初始默认当前页为1
currentPageNum = 1;
标签到文本等于字符串'当前第 %1 页'中的值,并通过编号获取指定的值。
ui.label->setText(tr(labelText.toStdString().c_str()));
ui.label_2->setText(tr(label2Text.toStdString().c_str()));
//初始默认不能点击上一页
ui.pushButton->setEnabled(false);
ui.pushButton_2->setEnabled(false);
if (sumPageNum > 1)
{
ui.pushButton_2->setEnabled(true);
}
doConnection();
setTableItem();
}
DividPage::~DividPage()
{
if(m_Connnection)
{
m_Connnection->close();
delete m_Connnection;
m_Connnection = 0;
}
}
int DividePage::getConnection(char* dbAddr, char* userName, char* pwd, char* dbName)
m_SqlDriver = sql::mysql::get_mysql_driver_instance();
if(!m_SqlDriver)
{
return -1;
}
m_Connnection = m_SqlDriver->connect(dbAddr,userName,pwd);
if(!m_Connnection)
{
return 0;
}
//m_Connection->setAutoCommit(0);//使事务执行时手动提交,并将事务设置为手动提交的操作只需设置一次参数即可完成
m_Connnection->setSchema(dbName);
return 1;
}
void DividPage::on_tableWidget_clicked(const QModelIndex &)
{
}
//根据给出的页码数查询数据库中的记录
QVector> DividPage::doquery(int pageNum)
{
//数据库采用utf-8编码
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
//vec存储的是返回的5条记录,每条记录的具体信息有vec1保存
vec.clear();
string queryStr;
queryStr = "select * from student limit ";
int beginNum = (pageNum-1)*5;
int endNum = 5;
stringstream ss,ss1;
string strBeginNum;
string strEndNum;
ss<>strBeginNum;
ss1<>strEndNum;
QString qqueryStr = QString::fromStdString(queryStr);
qqueryStr.append(QString::fromStdString(strBeginNum));
qqueryStr.append(",");
qqueryStr.append(QString::fromStdString(strEndNum));
sql::Statement * query = m_Connnection->createStatement();
sql::ResultSet * res = query->executeQuery(qqueryStr.toStdString());
while (res->next())
{
QVectorvec1;
string name = res->getString(2);
string sex = res->getString(3);
string age = res->getString(4);
string department = res->getString(5);
//将查询结果转换为QString
QString qname = tr(name.c_str());
QString qsex = tr(sex.c_str());
QString qage = tr(age.c_str());
QString qdepartment = tr(department.c_str());
vec1.append(qname);
vec1.append(qsex);
vec1.append(qage);
vec1.append(qdepartment);
vec.append(vec1);
}
return vec;
}
void DividPage::on_pushButton_clicked()
{
//上一页
ui.tableWidget->clear();
currentPageNum--;
ui.pushButton_2->setEnabled(true);
ui.pushButton->setEnabled(true);
if (currentPageNum == 1)
{
ui.pushButton->setEnabled(false);
}
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
声明一个QString变量label2Text,并将其值设定为字符串"当前第%1页"与数字currentPageNum结合后的结果
ui.label_2->setText(tr(label2Text.toStdString().c_str()));
setTableItem();
}
void DividPage::on_pushButton_2_clicked()
{
//下一页
ui.tableWidget->clear();
currentPageNum++;
ui.pushButton->setEnabled(true);
ui.pushButton_2->setEnabled(true);
if (currentPageNum == sumPageNum)
{
ui.pushButton_2->setEnabled(false);
}
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
此变量被赋值为一个格式化字符串(“当前第%1页”),并在参数位置插入currentPageNum的数值。
ui.label_2->setText(tr(label2Text.toStdString().c_str()));
setTableItem();
}
//返回数据库表中的条数
int DividPage::tableRowsNum(){
doConnection();
sql::Statement * query = m_Connnection->createStatement();
sql::ResultSet * res = query->executeQuery("select count(*) from student");
res->next();
string strNum =res->getString(1);
int num =atoi(strNum.c_str());
return num;
}
void DividPage::setTableItem(){
doquery(currentPageNum);
for (int i = 0;i < vec.size();i++)
{
QVectorvec_row = vec.at(i);
for (int j = 0;j < vec_row.size();j++)
{
QString qstr = vec_row.at(j);
QTableWidgetItem *tableItem = new QTableWidgetItem(qstr);
//使文本框居中显示
//tableItem->setTextAlignment(5);
ui.tableWidget->setItem(i,j,tableItem);
}
}
}
int DividPage::getSumPageNum(){
return (sumTableNum%5 == 0)?(sumTableNum/5):(sumTableNum/5+1);
}
//转到XX页
void DividPage::on_pushButton_3_clicked()
{
QString goPageNum = ui.lineEdit->text();
currentPageNum = goPageNum.toInt();
if (currentPageNum > sumPageNum)
{
QMessageBox msg;
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
msg.setText(tr("输入页码超过能显示的最大页数,请重新输入"));
msg.exec();
}
else{
ui.tableWidget->clear();
ui.pushButton->setEnabled(true);
ui.pushButton_2->setEnabled(true);
if (currentPageNum == 1)
{
ui.pushButton->setEnabled(false);
}
if (currentPageNum == sumPageNum)
{
ui.pushButton_2->setEnabled(false);
}
doquery(currentPageNum);
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
Q*String labelToText = Q*String("当前第%1页").arg(stringNumber(currentPageNum));
ui.label_2->setText(tr(label2Text.toStdString().c_str()));
setTableItem();
}
}
