Qt中配置Limereport的數(shù)據(jù)庫數(shù)據(jù)源的實(shí)現(xiàn)
一、基本配置流程
添加數(shù)據(jù)庫模塊
首先在.pro文件中確保啟用 Qt SQL 模塊:QT += sql
數(shù)據(jù)庫連接
使用 Qt 的QSqlDatabase建立數(shù)據(jù)庫連接,支持 MySQL、PostgreSQL、SQLite 等主流數(shù)據(jù)庫:
dbmanager.cpp文件如下:
#include "dbmanager.h"
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
DBManager::DBManager(QObject *parent) : QObject(parent)
{
}
bool DBManager::connectToDatabase(const QString &dbType, const QString &host,
int port, const QString &dbName,
const QString &user, const QString &password)
{
// 檢查是否已存在相同名稱的連接
if (QSqlDatabase::contains("limereport_conn")) {
m_db = QSqlDatabase::database("limereport_conn");
} else {
// 創(chuàng)建新連接
m_db = QSqlDatabase::addDatabase(dbType, "limereport_conn");
m_db.setHostName(host);
m_db.setPort(port);
m_db.setDatabaseName(dbName);
m_db.setUserName(user);
m_db.setPassword(password);
}
// 測試連接
if (!m_db.open()) {
qCritical() << "數(shù)據(jù)庫連接失敗:" << m_db.lastError().text();
return false;
}
qDebug() << "數(shù)據(jù)庫連接成功";
return true;
}
// 針對(duì)SQLite的簡化連接方法
bool DBManager::connectToSQLite(const QString &dbPath)
{
return connectToDatabase("QSQLITE", "", 0, dbPath, "", "");
}
QSqlDatabase DBManager::database() const
{
return m_db;
}
二、綁定數(shù)據(jù)源到報(bào)表
連接數(shù)據(jù)庫后,需要?jiǎng)?chuàng)建數(shù)據(jù)模型并綁定到 Limereport 報(bào)表:
reportgenerator.cpp文件如下:
#include "reportgenerator.h"
#include "limereport/limereport.h"
#include <QSqlQueryModel>
#include <QSqlQuery>
ReportGenerator::ReportGenerator(QObject *parent) : QObject(parent)
{
}
bool ReportGenerator::generateReport(const QString &templatePath, DBManager *dbManager)
{
if (!dbManager || !dbManager->database().isOpen()) {
qCritical() << "數(shù)據(jù)庫連接未就緒";
return false;
}
// 創(chuàng)建報(bào)表實(shí)例
LimeReport::Report *report = new LimeReport::Report();
// 1. 創(chuàng)建并綁定主數(shù)據(jù)集
QSqlQueryModel *mainModel = new QSqlQueryModel(report);
mainModel->setQuery("SELECT id, name, price, stock FROM products", dbManager->database());
// 為字段設(shè)置友好名稱(在報(bào)表設(shè)計(jì)器中顯示)
mainModel->setHeaderData(0, Qt::Horizontal, "產(chǎn)品ID");
mainModel->setHeaderData(1, Qt::Horizontal, "產(chǎn)品名稱");
mainModel->setHeaderData(2, Qt::Horizontal, "單價(jià)");
mainModel->setHeaderData(3, Qt::Horizontal, "庫存");
// 添加到報(bào)表數(shù)據(jù)源,"products"為數(shù)據(jù)源名稱(設(shè)計(jì)器中需對(duì)應(yīng))
report->dataManager()->addModel("products", mainModel, true);
// 2. 可選:添加第二個(gè)數(shù)據(jù)集(例如訂單數(shù)據(jù))
QSqlQueryModel *orderModel = new QSqlQueryModel(report);
orderModel->setQuery("SELECT order_no, order_date, customer FROM orders WHERE status=1",
dbManager->database());
report->dataManager()->addModel("orders", orderModel, true);
// 3. 可選:添加報(bào)表參數(shù)
report->setParameterValue("companyName", "我的公司");
report->setParameterValue("reportDate", QDate::currentDate().toString("yyyy-MM-dd"));
// 加載報(bào)表模板
if (!report->loadFromFile(templatePath)) {
qCritical() << "加載報(bào)表模板失敗:" << report->lastError();
delete report;
return false;
}
// 預(yù)覽報(bào)表
report->previewReport();
// 報(bào)表會(huì)在預(yù)覽窗口關(guān)閉后自動(dòng)釋放
return true;
}
三、報(bào)表設(shè)計(jì)器中的數(shù)據(jù)源配置
加載數(shù)據(jù)源
在 Limereport 設(shè)計(jì)器中,點(diǎn)擊菜單欄的「Data」→「Data Sources」,可以看到代碼中添加的數(shù)據(jù)源(如 “products”、“orders”)。綁定數(shù)據(jù)字段
- 拖拽「Text」元素到報(bào)表
- 雙擊文本元素,在彈出的編輯器中使用
[數(shù)據(jù)源名稱.字段名]格式綁定,例如:[products.name]綁定產(chǎn)品名稱[orders.order_date]綁定訂單日期
使用參數(shù)
報(bào)表參數(shù)通過[參數(shù)名]格式引用,例如[companyName]或[reportDate]。
四、不同數(shù)據(jù)庫的連接參數(shù)示例
| 數(shù)據(jù)庫類型 | dbType 參數(shù) | 典型連接參數(shù) |
|---|---|---|
| SQLite | “QSQLITE” | 只需指定 dbName 為數(shù)據(jù)庫文件路徑 |
| MySQL | “QMYSQL” | host、port(3306)、dbName、user、password |
| PostgreSQL | “QPSQL” | host、port(5432)、dbName、user、password |
| SQL Server | “QODBC” | 使用ODBC連接字符串 |
五、常見問題解決
數(shù)據(jù)庫驅(qū)動(dòng)缺失
確保 Qt 安裝了對(duì)應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng),可通過QSqlDatabase::drivers()查看已安裝驅(qū)動(dòng)。數(shù)據(jù)源名稱不匹配
代碼中addModel()的第一個(gè)參數(shù)必須與報(bào)表設(shè)計(jì)器中使用的數(shù)據(jù)源名稱完全一致。中文亂碼問題
確保數(shù)據(jù)庫連接使用正確的字符集(如 UTF8),可在連接后執(zhí)行:QSqlQuery query(dbManager->database()); query.exec("SET NAMES 'utf8'");
通過以上步驟,即可在 Qt 中為 Limereport 配置數(shù)據(jù)庫數(shù)據(jù)源,實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)報(bào)表的生成。
到此這篇關(guān)于Qt中配置Limereport的數(shù)據(jù)庫數(shù)據(jù)源的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt配置Limereport數(shù)據(jù)源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ IO流詳解之標(biāo)準(zhǔn)IO、文件IO與字符串IO實(shí)戰(zhàn)
本文詳細(xì)介紹了C++中的IO流,包括標(biāo)準(zhǔn)IO流、文件IO流和字符串IO流,文章介紹了如何重載運(yùn)算符以支持自定義類型的IO流操作,并提供了一些實(shí)戰(zhàn)案例來說明如何使用IO流解決實(shí)際問題,感興趣的朋友跟隨小編一起看看吧2026-03-03
C語言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放
這篇文章主要介紹了C語言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
總結(jié)了24個(gè)C++的大坑,你能躲過幾個(gè)
這篇文章主要介紹了總結(jié)了24個(gè)C++的大坑,你能躲過幾個(gè),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-05-05
windows上配置vscode?C/C++代碼跳轉(zhuǎn)的實(shí)現(xiàn)
C/C++官方的C/C++插件,必備的插件,是代碼跳轉(zhuǎn)、自動(dòng)補(bǔ)全、代碼大綱顯示等功能的基礎(chǔ),本文主要介紹了windows上配置vscode?C/C++代碼跳轉(zhuǎn),感興趣的可以了解一下2023-09-09
C++/JAVA/C#子類調(diào)用父類函數(shù)情況總結(jié)
今天小編就為大家分享一篇關(guān)于C++/JAVA/C#子類調(diào)用父類函數(shù)情況總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
C語言使用openSSL庫AES模塊實(shí)現(xiàn)加密功能詳解
這篇文章主要介紹了C語言使用openSSL庫AES模塊實(shí)現(xiàn)加密功能,詳細(xì)分析了C語言加密的相關(guān)概念、原理及AES模塊加密具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05

