1.表格
十几万条数据的表格如果一次性查询会导致tableview显示时卡死。则需要分页,按下按键点击下一页实时显示20条数据,如下表格。
2.sql语句
例如:查询warn_record表格第20-40条数据
SELECT * FROM(SELECT A.*,ROWNUM RN FROM(SELECT * FROM "warn_record")
A WHERE ROWNUM <= 40)WHERE RN >= 20;
3.qt关键代码
#ifndef SQL_TEST_H
#define SQL_TEST_H
#include <QWidget>
#include "SQL_test.h"
#include <QtSql/QSqlDatabase> // 连接数据库
#include <QtSql/QSqlError> // 数据库连接失败打印报错语句
#include <QtSql/QSqlQuery> // 数据库操作(增删改查)
#include <QMessageBox>
#include <QVariantList> // 泛型链表,可以存储任何类型的数据
#include <QDebug>
#include <QString>
#include <QSqlQueryModel>
#include <QTableView>
#include <QStandardItemModel>
class SQL_TEST : public QWidget
{
Q_OBJECT
public:
explicit SQL_TEST(QWidget *parent = nullptr);
~SQL_TEST();
QStandardItemModel* model;
QTableView * view;
private:
Ui::SQL_TEST *ui;
void on_MySql_Connet();//数据库连接
void on_next();//下一页
QSqlDatabase db;
QSqlQuery query1;
long int aaa ;//当前数据行数
int x ;//当前页数
};
#endif // SQL_TEST_H
SQL_TEST::SQL_TEST(QWidget *parent) :
QWidget(parent),
ui(new Ui::SQL_TEST)
{
ui->setupUi(this);
//tableview 和 QStanditenmodel
model = new QStandardItemModel(this);
view = new QTableView(this) ;
view->setModel(model);
view->setGeometry(0,0,600,700);
QStringList table_h_headers;
table_h_headers << "编号" << "库号" << "报警名称" << "报警类型" << "报警等级" << "报警时间"<< "变位信息";
model->setHorizontalHeaderLabels(table_h_headers);//设置表头及颜色
view->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}");
view->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);// 表格宽度随内容自动扩展
view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);// 表格宽度自动根据UI进行计算,不可手动调整宽度
view->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);// 固定表格高度不可扩展,不可手动调整高度
//view->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);// 表格高度随内容自动扩展
//view->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);// 表格高度自动根据UI进行计算,不可手动调整高度
//view->setShowGrid(false);// 隐藏网格线
view->setShowGrid(true);// 显示网格线
//view->setGridStyle(Qt::DotLine);// 线的样式
//view->setAlternatingRowColors(true);//隔行换颜色
view->setSelectionBehavior(QAbstractItemView::SelectRows);//选择整行
view->setFocusPolicy(Qt::NoFocus);//取消选中框
//view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//布局排版是全部伸展开的效果
connect(ui->pushButton, &QPushButton::clicked, this, &SQL_TEST::on_MySql_Connet);//数据库连接
connect(ui->pushButton_9, &QPushButton::clicked, this, &SQL_TEST::on_next);//下一页
}
SQL_TEST::~SQL_TEST()
{
db.close(); // 关闭数据库
delete ui;
}
//数据库连接
void SQL_TEST::on_MySql_Connet()
{
//oracle数据库
db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("192.168.1.130");//数据库地址
db.setDatabaseName("xe");//安装时全局数据库名
db.setUserName("whxwkj_222");//数据库名称
db.setPassword("XwKj@123");//密码
db.setPort(1521);//oracle数据库端口
aaa=0; //清0
x=0;
// 打开数据库
if (!db.open()) { // 数据库打开失败
db.exec("SET NAMES 'GBK'");
QMessageBox::warning(this, "警报", db.lastError().text()); // 显示错误信息
return;
}
else {
QMessageBox::information(this, "提示", "数据库连接成功");
}
query1 = QSqlQuery(db);
}
//未处理数据不足一页情况,数据低于20。
void SQL_TEST::on_next()
{
QVariant temp;
QString sql;
model->clear();
QStringList table_h_headers;
table_h_headers << "编号" << "库号" << "报警名称" << "报警类型" << "报警等级" << "报警时间"<< "变位信息";
model->setHorizontalHeaderLabels(table_h_headers);//设置表头及颜色
//查询表的行数
sql = QString("SELECT * FROM \"warn_record\"");
query1.exec(sql); // 查询数据库user_def的表的所有行和列
qDebug() << sql;
QSqlRecord rec = query1.record();
qDebug() << "表的总列数:" << QString::number(rec.count()); // 表一共有多少列
ui->lineEdit_7->setText(QString::number(rec.count()));
int j= 0;
//查询行数
sql = QString("SELECT count(\"Id\") FROM \"warn_record\"");
query1.exec(sql);
query1.next();
temp = query1.value(0);
int numhang = query1.value(0).toInt();
qDebug() << "行数:" << numhang;
int numtrue;//余数
int num = numhang/20;//页数
if((num%20))
{
numtrue = num%20;
num = num+1;
ui->label_17->setText(QString::number(num));
qDebug() << "表的页数:" << num;
}
else{
qDebug() << "表的页数:" << num;
ui->label_17->setText(QString::number(num));
}
qDebug() << "表余数:" << numtrue;
if(num >0 || (numtrue > 0))
{
QSqlQuery query2;
sql = QString("SELECT * FROM(SELECT A.*,ROWNUM RN FROM(SELECT * FROM \"warn_record\") A WHERE ROWNUM <= %2)WHERE RN >= %1").arg(QString::number(aaa+1)).arg((QString::number(aaa+20)));
qDebug() << sql;
query2.exec(sql);
//qDebug() << aaa;
//qDebug() << query2.next();
while (query2.next())
{
int i = 0;
QVariant temp;
while ((temp = query2.value(i++)).isValid()){
model ->setItem(j, i-1, new QStandardItem(temp.toString()));
if (i==7)//数据库中只有7个字段//过滤掉别名字段
break;
}
j++;
}
x++;//记录当前页数
ui->label_19->setText(QString::number(x));
}
aaa = aaa+20;//翻页数据加20
//居中显示
if(num >0)
for (int i = 0; i<20; i++)
{
for (int j = 0; j<7; j++)
{
model->item (i,j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
}
}
}