Advertisement

qt mysql分页显示_qt 数据库查询结构的分页显示

阅读量:

QT界面中实现数据库查询结果的分页显示

昨天做的,今天整理了下。

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

以下是截图:

程序刚运行出来的时候:

58de63de382c6e7558cb5232b0dd9b7e.png

点击下一页到尾页:

64ab49d0cf3d749b3da2144bba455076.png

转到第X页:

fbb8359aadb02d3c179e89ea832e415d.png

代码:

头文件:

#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();

}

}

全部评论 (0)

还没有任何评论哟~