diff --git a/README.md b/README.md index 5c14b7f..249a011 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,5 @@ Qt编写的一些开源的demo,包括串口调试助手、网络调试助手 | 11 | video_splite | 视频监控画面分割demo | | 12 | framelesswidget | 通用无边框拖动拉伸类 | | 13 | ipaddress | IP地址输入控件 | -| 14 | bgdemo | 无边框背景透明窗体 | \ No newline at end of file +| 14 | bgdemo | 无边框背景透明窗体 | +| 15 | dbpage | 通用数据库翻页查询 | \ No newline at end of file diff --git a/dbpage/TA.db b/dbpage/TA.db new file mode 100644 index 0000000..b3b1df7 Binary files /dev/null and b/dbpage/TA.db differ diff --git a/dbpage/dbpage.cpp b/dbpage/dbpage.cpp new file mode 100644 index 0000000..ec4ab64 --- /dev/null +++ b/dbpage/dbpage.cpp @@ -0,0 +1,487 @@ +#include "dbpage.h" + +SqlQueryModel::SqlQueryModel(QObject *parent) : QSqlQueryModel(parent) +{ + allCenter = false; + alignCenterColumn.clear(); + alignRightColumn.clear(); +} + +QVariant SqlQueryModel::data(const QModelIndex &index, int role) const +{ + QVariant value = QSqlQueryModel::data(index, role); + + if (allCenter) { + if(role == Qt::TextAlignmentRole ) { + value = Qt::AlignCenter; + } + } else { + //逐个从列索引中查找是否当前列在其中 + int column = index.column(); + bool existCenter = alignCenterColumn.contains(column); + bool existRight = alignRightColumn.contains(column); + + if(role == Qt::TextAlignmentRole) { + if (existCenter) { + value = Qt::AlignCenter; + } + + if (existRight) { + value = (QVariant)(Qt::AlignVCenter | Qt::AlignRight); + } + } + } + + return value; +} + +void SqlQueryModel::setAllCenter(bool allCenter) +{ + this->allCenter = allCenter; +} + +void SqlQueryModel::setAlignCenterColumn(const QList &alignCenterColumn) +{ + this->alignCenterColumn = alignCenterColumn; +} + +void SqlQueryModel::setAlignRightColumn(const QList &alignRightColumn) +{ + this->alignRightColumn = alignRightColumn; +} + + +DbCountThread::DbCountThread(QObject *parent) : QThread(parent) +{ + connName = "qt_sql_default_connection"; + sql = "select 1"; + + connect(this, SIGNAL(finished()), this, SLOT(deleteLater())); +} + +void DbCountThread::run() +{ + //计算用时 + QDateTime dtStart = QDateTime::currentDateTime(); + + QSqlQuery query(QSqlDatabase::database(connName)); + query.exec(sql); + query.next(); + int count = query.value(0).toUInt(); + + QDateTime dtEnd = QDateTime::currentDateTime(); + double msec = dtStart.msecsTo(dtEnd); + emit receiveCount(count, msec); +} + +void DbCountThread::setConnName(const QString &connName) +{ + this->connName = connName; +} + +void DbCountThread::setSql(const QString &sql) +{ + this->sql = sql; +} + + +QScopedPointer DbPage::self; +DbPage *DbPage::Instance() +{ + if (self.isNull()) { + QMutex mutex; + QMutexLocker locker(&mutex); + if (self.isNull()) { + self.reset(new DbPage); + } + } + + return self.data(); +} + +DbPage::DbPage(QObject *parent) : QObject(parent) +{ + startIndex = 0; + tempSql = ""; + sql = ""; + queryModel = new SqlQueryModel; + + pageCurrent = 1; + pageCount = 0; + resultCount = 0; + resultCurrent = 0; + + labPageCount = 0; + labPageCurrent = 0; + labResultCount = 0; + labResultCurrent = 0; + labResult = 0; + labInfo = 0; + + tableView = 0; + btnFirst = 0; + btnPre = 0; + btnNext = 0; + btnLast = 0; + + countName = "*"; + connName = "qt_sql_default_connection"; + dbType = DbType_Sqlite; + + pageCurrent = 0; + pageCount = 0; + resultCount = 0; + resultCurrent = 30; + + tableName = ""; + selectColumn = "*"; + orderSql = ""; + whereSql = ""; + columnNames.clear(); + columnWidths.clear(); + + insertColumnIndex = -1; + insertColumnName = ""; + insertColumnWidth = 50; +} + +void DbPage::bindData(const QString &columnName, const QString &orderColumn, const QString &tableName, + QComboBox *cbox, const QString &connName) +{ + QSqlQuery query(QSqlDatabase::database(connName)); + query.exec("select " + columnName + " from " + tableName + " order by " + orderColumn + " asc"); + while (query.next()) { + cbox->addItem(query.value(0).toString()); + } +} + +void DbPage::bindData(const QString &columnName, const QString &orderColumn, const QString &tableName, + QList cboxs, const QString &connName) +{ + QSqlQuery query(QSqlDatabase::database(connName)); + query.exec("select " + columnName + " from " + tableName + " order by " + orderColumn + " asc"); + while (query.next()) { + foreach (QComboBox *cbox, cboxs) { + cbox->addItem(query.value(0).toString()); + } + } +} + +void DbPage::bindData(const QString &sql) +{ + queryModel->setQuery(sql, QSqlDatabase::database(connName)); + tableView->setModel(queryModel); + + //依次设置列标题列宽 + int columnCount = tableView->model()->columnCount(); + int nameCount = columnNames.count(); + columnCount = columnCount > nameCount ? nameCount : columnCount; + + QList columnNames = this->columnNames; + QList columnWidths = this->columnWidths; + + //根据设置添加新列,将对应新列的标题名称和宽度按照索引位置插 + if (insertColumnIndex >= 0) { + columnCount++; + columnNames.insert(insertColumnIndex, insertColumnName); + columnWidths.insert(insertColumnIndex, insertColumnWidth); + queryModel->insertColumn(insertColumnIndex); + } + + //设置列标题和列宽度 + for (int i = 0; i < columnCount; i++) { + queryModel->setHeaderData(i, Qt::Horizontal, columnNames.at(i)); + tableView->setColumnWidth(i, columnWidths.at(i)); + } + + if (labPageCurrent != 0) { + labPageCurrent->setText(QString("第 %1 页").arg(pageCurrent)); + } + + if (labPageCount != 0) { + labPageCount->setText(QString("共 %1 页").arg(pageCount)); + } + + if (labResultCount != 0) { + labResultCount->setText(QString("共 %1 条").arg(resultCount)); + } + + if (labResultCurrent != 0) { + labResultCurrent->setText(QString("每页 %1 条").arg(resultCurrent)); + } + + if (labInfo != 0) { + labInfo->setText(QString("共 %1 条 每页 %2 条 共 %3 页 第 %4 页").arg(resultCount).arg(resultCurrent).arg(pageCount).arg(pageCurrent)); + } + + //发送结果信号 + emit receivePage(pageCurrent, pageCount, resultCount, resultCurrent); +} + +void DbPage::slot_receiveCount(quint32 count, double msec) +{ + if (labResult != 0) { + labResult->setText(QString("查询用时 %1 秒").arg(QString::number(msec / 1000, 'f', 3))); + } + + resultCount = count; + + int yushu = resultCount % resultCurrent; + + //不存在余数,说明是整行,例如300%5==0 + if (yushu == 0) { + if (resultCount > 0 && resultCount < resultCurrent) { + pageCount = 1; + } else { + pageCount = resultCount / resultCurrent; + } + } else { + pageCount = (resultCount / resultCurrent) + 1; + } + + //2014-10-9增加翻页按钮可用不可用处理,如果只有一页数据,则翻页按钮不可用 + if (pageCount <= 1) { + btnFirst->setEnabled(false); + btnLast->setEnabled(false); + btnNext->setEnabled(false); + btnPre->setEnabled(false); + } else { + btnFirst->setEnabled(true); + btnLast->setEnabled(true); + btnNext->setEnabled(true); + btnPre->setEnabled(true); + } + + tempSql = QString("select %1 from %2 %3 order by %4").arg(selectColumn).arg(tableName).arg(whereSql).arg(orderSql); + sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent); //组织分页SQL语句 + + bindData(sql); +} + +void DbPage::first() +{ + if (pageCount > 1) { + startIndex = 0; + pageCurrent = 1; + sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent); + bindData(sql); + btnLast->setEnabled(true); + btnNext->setEnabled(true); + } + + btnFirst->setEnabled(false); + btnPre->setEnabled(false); +} + +void DbPage::previous() +{ + if (pageCurrent > 1) { + pageCurrent--; + startIndex -= resultCurrent; + sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent); + bindData(sql); + btnLast->setEnabled(true); + btnNext->setEnabled(true); + } + + if (pageCurrent == 1) { + btnFirst->setEnabled(false); + btnPre->setEnabled(false); + } +} + +void DbPage::next() +{ + if (pageCurrent < pageCount) { + pageCurrent++; + startIndex += resultCurrent; + sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent); + bindData(sql); + btnFirst->setEnabled(true); + btnPre->setEnabled(true); + } + + if (pageCurrent == pageCount) { + btnLast->setEnabled(false); + btnNext->setEnabled(false); + } +} + +void DbPage::last() +{ + if (pageCount > 0) { + startIndex = (pageCount - 1) * resultCurrent; + pageCurrent = pageCount; + sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent); + bindData(sql); + btnFirst->setEnabled(true); + btnPre->setEnabled(true); + } + + btnLast->setEnabled(false); + btnNext->setEnabled(false); +} + +//设置显示数据的表格控件,当前翻页信息的标签控件等 +void DbPage::setControl(QTableView *tableView, + QLabel *labPageCount, QLabel *labPageCurrent, + QLabel *labResultCount, QLabel *labResultCurrent, + QLabel *labResult, QLabel *labInfo, + QAbstractButton *btnFirst, QAbstractButton *btnPre, + QAbstractButton *btnNext, QAbstractButton *btnLast, + const QString &countName, const QString &connName) +{ + this->tableView = tableView; + this->labPageCount = labPageCount; + this->labPageCurrent = labPageCurrent; + this->labResultCount = labResultCount; + this->labResultCurrent = labResultCurrent; + this->labResult = labResult; + this->labInfo = labInfo; + + this->btnFirst = btnFirst; + this->btnPre = btnPre; + this->btnNext = btnNext; + this->btnLast = btnLast; + + this->countName = countName; + this->connName = connName; + this->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + + //挂载翻页按钮事件 + connect(btnFirst, SIGNAL(clicked()), this, SLOT(first())); + connect(btnPre, SIGNAL(clicked()), this, SLOT(previous())); + connect(btnNext, SIGNAL(clicked()), this, SLOT(next())); + connect(btnLast, SIGNAL(clicked()), this, SLOT(last())); +} + +void DbPage::setConnName(const QString &connName) +{ + this->connName = connName; +} + +void DbPage::setDbType(const DbPage::DbType &dbType) +{ + this->dbType = dbType; +} + +void DbPage::setTableName(const QString &tableName) +{ + this->tableName = tableName; +} + +void DbPage::setSelectColumn(const QString &selectColumn) +{ + this->selectColumn = selectColumn; +} + +void DbPage::setOrderSql(const QString &orderSql) +{ + this->orderSql = orderSql; +} + +void DbPage::setWhereSql(const QString &whereSql) +{ + this->whereSql = whereSql; +} + +void DbPage::setResultCurrent(int resultCurrent) +{ + this->resultCurrent = resultCurrent; +} + +void DbPage::setColumnNames(const QList &columnNames) +{ + this->columnNames = columnNames; +} + +void DbPage::setColumnWidths(const QList &columnWidths) +{ + this->columnWidths = columnWidths; +} + +void DbPage::setAllCenter(bool allCenter) +{ + queryModel->setAllCenter(allCenter); +} + +void DbPage::setAlignCenterColumn(const QList &alignCenterColumn) +{ + queryModel->setAlignCenterColumn(alignCenterColumn); +} + +void DbPage::setAlignRightColumn(const QList &alignRightColumn) +{ + queryModel->setAlignRightColumn(alignRightColumn); +} + +void DbPage::setInsertColumnIndex(int insertColumnIndex) +{ + this->insertColumnIndex = insertColumnIndex; +} + +void DbPage::setInsertColumnName(const QString &insertColumnName) +{ + this->insertColumnName = insertColumnName; +} + +void DbPage::setInsertColumnWidth(int insertColumnWidth) +{ + this->insertColumnWidth = insertColumnWidth; +} + +void DbPage::select() +{ + //重置开始索引 + startIndex = 0; + pageCurrent = 1; + + //假设只有一页 + slot_receiveCount(resultCurrent, 0); + + //全部禁用按钮,文本显示正在查询... + btnFirst->setEnabled(false); + btnLast->setEnabled(false); + btnNext->setEnabled(false); + btnPre->setEnabled(false); + + QString info = "正在查询..."; + + if (labInfo != 0) { + labInfo->setText(info); + } + + if (labPageCurrent != 0) { + labPageCurrent->setText(info); + } + + if (labPageCount != 0) { + labPageCount->setText(info); + } + + if (labResultCount != 0) { + labResultCount->setText(info); + } + + if (labResultCurrent != 0) { + labResultCurrent->setText(info); + } + + if (labResult != 0) { + labResult->setText(info); + } + + //开始分页绑定数据前,计算好总数据量以及行数 + tempSql = QString("select count(%1) from %2 %3").arg(countName).arg(tableName).arg(whereSql); + + //采用线程执行查询复合条件的记录行数 + DbCountThread *dbCountThread = new DbCountThread(this); + //绑定查询结果信号槽,一旦收到结果则立即执行 + connect(dbCountThread, SIGNAL(receiveCount(quint32, double)), this, SIGNAL(receiveCount(quint32, double))); + connect(dbCountThread, SIGNAL(receiveCount(quint32, double)), this, SLOT(slot_receiveCount(quint32, double))); + + //设置数据库连接名称和查询语句,并启动线程 + dbCountThread->setConnName(connName); + dbCountThread->setSql(tempSql); + dbCountThread->start(); +} diff --git a/dbpage/dbpage.h b/dbpage/dbpage.h new file mode 100644 index 0000000..0e43e3b --- /dev/null +++ b/dbpage/dbpage.h @@ -0,0 +1,213 @@ +#ifndef DBPAGE_H +#define DBPAGE_H + +/** + * 数据库通用翻页类 作者:feiyangqingyun(QQ:517216493) 2017-1-15 + * 1:自动按照设定的每页多少行数据分页 + * 2:只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签 + * 3:提供公共静态方法绑定字段数据到下拉框 + * 4:建议条件字段用数字类型的主键,速度极快 + * 5:增加线程查询符合条件的记录总数,数据量巨大时候不会卡主界面 + * 6:提供查询结果返回信号,包括当前页/总页数/总记录数/查询用时 + * 7:可设置所有列或者某一列对齐样式例如居中或者右对齐 + * 8:可设置增加一列,列的位置,标题,宽度 + * 9:可设置要查询的字段集合 + */ + +#include +#include +#if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) +#include +#endif + +//自定义模型设置列居中和右对齐 +class SqlQueryModel: public QSqlQueryModel +{ +public: + explicit SqlQueryModel(QObject *parent = 0); + +protected: + QVariant data(const QModelIndex &index, int role) const; + +private: + bool allCenter; //所有居中 + QList alignCenterColumn; //居中对齐列 + QList alignRightColumn; //右对齐列 + +public: + //设置所有列居中 + void setAllCenter(bool allCenter); + + //设置居中对齐列索引集合 + void setAlignCenterColumn(const QList &alignCenterColumn); + + //设置右对齐列索引集合 + void setAlignRightColumn(const QList &alignRightColumn); + +}; + +//计算复合条件的记录总行数,以便分页 +class DbCountThread : public QThread +{ + Q_OBJECT +public: + explicit DbCountThread(QObject *parent = 0); + +private: + QString connName; //数据库连接名称 + QString sql; //要执行的查询语句 + +protected: + void run(); + +signals: + void receiveCount(quint32 count, double msec); + +public slots: + //设置数据库连接名称 + void setConnName(const QString &connName); + + //设置要执行的查询语句 + void setSql(const QString &sql); + +}; + +class DbPage : public QObject +{ + Q_OBJECT +public: + enum DbType { + DbType_Sqlite = 0, //sqlite数据库 + DbType_MySql = 1, //mysql数据库 + DbType_SqlServer = 3, //sqlserver数据库 + DbType_Access = 4, //access数据库 + DbType_PostgreSQL = 5 //postgresql数据库 + }; + + static DbPage *Instance(); + explicit DbPage(QObject *parent = 0); + + //绑定数据到下拉框 + static void bindData(const QString &columnName, const QString &orderColumn, const QString &tableName, + QComboBox *cbox, const QString &connName = "qt_sql_default_connection"); + static void bindData(const QString &columnName, const QString &orderColumn, const QString &tableName, + QList cboxs, const QString &connName = "qt_sql_default_connection"); + +private: + static QScopedPointer self; + + int startIndex; //分页开始索引,每次翻页都变动 + QString tempSql; //临时SQL语句 + QString sql; //sql语句 + SqlQueryModel *queryModel; //查询模型 + + QLabel *labPageCount; //总页数标签 + QLabel *labPageCurrent; //当前页标签 + QLabel *labResultCount; //总记录数标签 + QLabel *labResultCurrent; //每页记录数标签 + QLabel *labResult; //显示查询用时标签 + QLabel *labInfo; //总页数当前页总记录数每页记录数 + + QTableView *tableView; //显示数据的表格对象 + QAbstractButton *btnFirst; //第一页按钮对象 + QAbstractButton *btnPre; //上一页按钮对象 + QAbstractButton *btnNext; //下一页按钮对象 + QAbstractButton *btnLast; //末一页按钮对象 + + QString countName; //统计表行数用字段 + QString connName; //所使用的数据库连接名 + DbType dbType; //数据库类型 + + quint32 pageCurrent; //当前第几页 + quint32 pageCount; //总页数 + quint32 resultCount; //总记录数 + quint32 resultCurrent; //每页显示记录数 + + QString tableName; //表名 + QString selectColumn; //要查询的字段集合 + QString orderSql; //排序语句 + QString whereSql; //条件语句 + QList columnNames; //列名集合 + QList columnWidths; //列宽集合 + + int insertColumnIndex; //插入的列的索引位置 + QString insertColumnName; //插入的列的标题 + int insertColumnWidth; //插入的列的宽度 + +private slots: + void first(); //第一页 + void previous(); //上一页 + void next(); //下一页 + void last(); //末一页 + +private slots: + //绑定sql语句到表格 + void bindData(const QString &sql); + + //收到记录行数 + void slot_receiveCount(quint32 count, double msec); + +signals: + void receivePage(quint32 pageCurrent, quint32 pageCount, quint32 resultCount, quint32 resultCurrent); + void receiveCount(quint32 count, double msec); + +public slots: + //设置需要显示数据的表格,数据翻页对应的按钮 + void setControl(QTableView *tableView, + QLabel *labPageCount, QLabel *labPageCurrent, + QLabel *labResultCount, QLabel *labResultCurrent, + QLabel *labResult, QLabel *labInfo, + QAbstractButton *btnFirst, QAbstractButton *btnPre, + QAbstractButton *btnNext, QAbstractButton *btnLast, + const QString &countName, const QString &connName = "qt_sql_default_connection"); + + //设置数据库连接名称 + void setConnName(const QString &connName); + + //设置数据库类型 + void setDbType(const DbType &dbType); + + //设置要查询的表名 + void setTableName(const QString &tableName); + + //设置要查询的字段列名集合 + void setSelectColumn(const QString &selectColumn); + + //设置排序sql + void setOrderSql(const QString &orderSql); + + //设置条件sql + void setWhereSql(const QString &whereSql); + + //设置每页显示多少行数据 + void setResultCurrent(int resultCurrent); + + //设置列名称集合 + void setColumnNames(const QList &columnNames); + + //设置列宽度集合 + void setColumnWidths(const QList &columnWidths); + + //设置所有列居中 + void setAllCenter(bool allCenter); + + //设置居中对齐列索引集合 + void setAlignCenterColumn(const QList &alignCenterColumn); + + //设置右对齐列索引集合 + void setAlignRightColumn(const QList &alignRightColumn); + + //设置插入的列的索引 + void setInsertColumnIndex(int insertColumnIndex); + + //设置插入的列的标题 + void setInsertColumnName(const QString &insertColumnName); + + //设置插入的列的宽度 + void setInsertColumnWidth(int insertColumnWidth); + + //执行查询 + void select(); +}; + +#endif // DBPAGE_H diff --git a/dbpage/dbpage.pro b/dbpage/dbpage.pro new file mode 100644 index 0000000..1a9b953 --- /dev/null +++ b/dbpage/dbpage.pro @@ -0,0 +1,33 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2017-01-15T14:34:50 +# +#------------------------------------------------- + +QT += core gui sql + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = dbpage +TEMPLATE = app +MOC_DIR = temp/moc +RCC_DIR = temp/rcc +UI_DIR = temp/ui +OBJECTS_DIR = temp/obj +DESTDIR = bin +PRECOMPILED_HEADER = head.h + +INCLUDEPATH += $$PWD +CONFIG += warn_off + +SOURCES += \ + main.cpp \ + dbpage.cpp \ + frmdbpage.cpp + +HEADERS += \ + dbpage.h \ + frmdbpage.h + +FORMS += \ + frmdbpage.ui diff --git a/dbpage/frmdbpage.cpp b/dbpage/frmdbpage.cpp new file mode 100644 index 0000000..ce06827 --- /dev/null +++ b/dbpage/frmdbpage.cpp @@ -0,0 +1,67 @@ +#include "frmdbpage.h" +#include "ui_frmdbpage.h" +#include "dbpage.h" + +frmDbPage::frmDbPage(QWidget *parent) : QWidget(parent), ui(new Ui::frmDbPage) +{ + ui->setupUi(this); + this->initForm(); +} + +frmDbPage::~frmDbPage() +{ + delete ui; +} + +void frmDbPage::initForm() +{ + columnNames.clear(); + columnWidths.clear(); + + tableName = "LogInfo"; + countName = "rowid"; + + columnNames.append("防区号"); + columnNames.append("防区名称"); + columnNames.append("设备IP"); + columnNames.append("日志类型"); + columnNames.append("事件内容"); + columnNames.append("触发时间"); + columnNames.append("告警详情"); + columnNames.append("告警数据"); + columnNames.append("告警图像"); + + columnWidths.append(70); + columnWidths.append(120); + columnWidths.append(120); + columnWidths.append(80); + columnWidths.append(150); + columnWidths.append(160); + columnWidths.append(160); + columnWidths.append(160); + columnWidths.append(160); + + //设置需要显示数据的表格和翻页的按钮 + dbPage = new DbPage(this); + //设置所有列居中显示 + dbPage->setAllCenter(true); + dbPage->setControl(ui->tableMain, ui->labPageCount, ui->labPageCurrent, ui->labResultCount, ui->labResultCurrent, ui->labResult, 0, + ui->btnFirst, ui->btnPre, ui->btnNext, ui->btnLast, countName); + ui->tableMain->horizontalHeader()->setStretchLastSection(true); + ui->tableMain->verticalHeader()->setDefaultSectionSize(25); +} + +void frmDbPage::on_btnSelect_clicked() +{ + ui->labResult->setText("正在查询..."); + + //绑定数据到表格 + QString sql = "where 1=1"; + dbPage->setTableName(tableName); + dbPage->setOrderSql(QString("%1 %2").arg(countName).arg("asc")); + dbPage->setWhereSql(sql); + dbPage->setResultCurrent(20); + dbPage->setColumnNames(columnNames); + dbPage->setColumnWidths(columnWidths); + dbPage->select(); +} diff --git a/dbpage/frmdbpage.h b/dbpage/frmdbpage.h new file mode 100644 index 0000000..8e139e2 --- /dev/null +++ b/dbpage/frmdbpage.h @@ -0,0 +1,37 @@ +#ifndef FRMDBPAGE_H +#define FRMDBPAGE_H + +#include + +class DbPage; + +namespace Ui { +class frmDbPage; +} + +class frmDbPage : public QWidget +{ + Q_OBJECT + +public: + explicit frmDbPage(QWidget *parent = 0); + ~frmDbPage(); + +private: + Ui::frmDbPage *ui; + + QList columnNames; //字段名集合 + QList columnWidths; //字段宽度集合 + DbPage *dbPage; //数据库翻页类 + + QString tableName; //表名称 + QString countName; //统计行数字段名称 + +private slots: + void initForm(); + +private slots: + void on_btnSelect_clicked(); +}; + +#endif // FRMDBPAGE_H diff --git a/dbpage/frmdbpage.ui b/dbpage/frmdbpage.ui new file mode 100644 index 0000000..2fa639a --- /dev/null +++ b/dbpage/frmdbpage.ui @@ -0,0 +1,296 @@ + + + frmDbPage + + + + 0 + 0 + 800 + 600 + + + + Form + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + Qt::Vertical + + + false + + + + + + + + + + + + + 190 + 0 + + + + + 190 + 16777215 + + + + QFrame::Box + + + QFrame::Sunken + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + 80 + 0 + + + + 查询 + + + + + + + + 50 + 0 + + + + 上一页 + + + + 18 + 18 + + + + + + + + + 50 + 0 + + + + 下一页 + + + + 18 + 18 + + + + + + + + + 50 + 0 + + + + 第一页 + + + + 18 + 18 + + + + + + + + + 50 + 0 + + + + 末一页 + + + + 18 + 18 + + + + + + + + + 0 + 25 + + + + QFrame::Box + + + QFrame::Sunken + + + + + + Qt::AlignCenter + + + + + + + + 0 + 25 + + + + QFrame::Box + + + QFrame::Sunken + + + + + + Qt::AlignCenter + + + + + + + + 0 + 25 + + + + QFrame::Box + + + QFrame::Sunken + + + + + + Qt::AlignCenter + + + + + + + + 0 + 25 + + + + QFrame::Box + + + QFrame::Sunken + + + + + + Qt::AlignCenter + + + + + + + + 0 + 25 + + + + QFrame::Box + + + QFrame::Sunken + + + + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + diff --git a/dbpage/head.h b/dbpage/head.h new file mode 100644 index 0000000..e5794ce --- /dev/null +++ b/dbpage/head.h @@ -0,0 +1,8 @@ +#include +#include +#include +#if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) +#include +#endif + +#pragma execution_character_set("utf-8") diff --git a/dbpage/main.cpp b/dbpage/main.cpp new file mode 100644 index 0000000..90570da --- /dev/null +++ b/dbpage/main.cpp @@ -0,0 +1,38 @@ +#include "frmdbpage.h" +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + a.setFont(QFont("Microsoft Yahei", 9)); + +#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) +#if _MSC_VER + QTextCodec *codec = QTextCodec::codecForName("gbk"); +#else + QTextCodec *codec = QTextCodec::codecForName("utf-8"); +#endif + QTextCodec::setCodecForLocale(codec); + QTextCodec::setCodecForCStrings(codec); + QTextCodec::setCodecForTr(codec); +#else + QTextCodec *codec = QTextCodec::codecForName("utf-8"); + QTextCodec::setCodecForLocale(codec); +#endif + + //打开数据库,整个应用程序可用 + QSqlDatabase dbConn = QSqlDatabase::addDatabase("QSQLITE"); + dbConn.setDatabaseName(qApp->applicationDirPath() + "/TA.db"); + if (dbConn.open()) { + qDebug() << "连接数据库成功!"; + } else { + qDebug() << "连接数据库失败!"; + } + + frmDbPage w; + w.setWindowTitle("数据库分页示例(作者:517216493)"); + w.show(); + + return a.exec(); +} diff --git a/dbpage/readme.txt b/dbpage/readme.txt new file mode 100644 index 0000000..d327fec --- /dev/null +++ b/dbpage/readme.txt @@ -0,0 +1 @@ +ǵýԴµTA.dbƵִļͬһĿ¼ \ No newline at end of file diff --git a/dbpage/snap/QQ截图20180905170132.png b/dbpage/snap/QQ截图20180905170132.png new file mode 100644 index 0000000..a88e4fc Binary files /dev/null and b/dbpage/snap/QQ截图20180905170132.png differ