新聞中心
Qt是一個(gè)跨平臺(tái)的圖形用戶(hù)界面應(yīng)用程序開(kāi)發(fā)框架,可用于開(kāi)發(fā)移動(dòng)設(shè)備、桌面應(yīng)用程序、嵌入式系統(tǒng)等多種軟件。Qt中有很多方便的工具,其中包括數(shù)據(jù)庫(kù)操作和PDF報(bào)表生成工具。在這篇文章中,我們將專(zhuān)注于如何使用Qt的這兩個(gè)工具結(jié)合起來(lái),實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作并生成PDF報(bào)表。

創(chuàng)新互聯(lián)建站科技有限公司專(zhuān)業(yè)互聯(lián)網(wǎng)基礎(chǔ)服務(wù)商,為您提供服務(wù)器托管,高防服務(wù)器,成都IDC機(jī)房托管,成都主機(jī)托管等互聯(lián)網(wǎng)服務(wù)。
一、數(shù)據(jù)庫(kù)操作
Qt中內(nèi)置了很多的數(shù)據(jù)庫(kù)類(lèi),支持多種數(shù)據(jù)庫(kù),包括MySQL、SQLite、PostgreSQL等。我們以SQLite為例,講述如何實(shí)現(xiàn)與數(shù)據(jù)庫(kù)操作。
1. SQLite數(shù)據(jù)庫(kù)
SQLite是一種輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),主要特點(diǎn)是不需要安裝和配置,同時(shí)具有極高的性能。它最適合于嵌入式設(shè)備和移動(dòng)設(shè)備上的應(yīng)用程序。
在Qt中,我們可以通過(guò)QSqlDatabase來(lái)連接SQLite數(shù)據(jù)庫(kù)。首先需要在項(xiàng)目中添加如下代碼:
“`c++
#include
#include
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
db.setDatabaseName(“test.db”);
if(!db.open()) {
qWarning()
}
“`
以上代碼中,我們首先include了QSqlDatabase和QDebug類(lèi)。接著,我們創(chuàng)建了一個(gè)QSqlDatabase對(duì)象db,并指定了它連接的數(shù)據(jù)庫(kù)類(lèi)型為SQLite。然后我們通過(guò)setDatabaseName方法指定了SQLite數(shù)據(jù)庫(kù)的名稱(chēng)為test.db,也可以指定其他的數(shù)據(jù)庫(kù)名稱(chēng)。如果連接成功,open()函數(shù)會(huì)返回true,否則返回false。如果連接失敗,我們通過(guò)qWarning()打印一條錯(cuò)誤信息。
之后,我們還需要執(zhí)行SQL語(yǔ)句,可以通過(guò)QSqlQuery來(lái)實(shí)現(xiàn)。下面是一段簡(jiǎn)單的SQL語(yǔ)句:
“`c++
QSqlQuery query;
query.exec(“CREATE TABLE user (id INT PRIMARY KEY, name VARCHAR(20), age INT)”);
query.exec(“INSERT INTO user VALUES(1, ‘Tom’, 18)”);
“`
在上述代碼中,我們首先創(chuàng)建一個(gè)QSqlQuery對(duì)象query,之后通過(guò)SQL語(yǔ)句創(chuàng)建了一個(gè)名為user的表,并插入了一條id為1,name為T(mén)om,age為18的數(shù)據(jù)。
到此為止,我們已經(jīng)成功地實(shí)現(xiàn)了與SQLite數(shù)據(jù)庫(kù)的連接和數(shù)據(jù)插入操作。但是,這并不足以說(shuō)明Qt的數(shù)據(jù)庫(kù)操作功能。
2. 數(shù)據(jù)庫(kù)查詢(xún)
在實(shí)際應(yīng)用中,我們通常需要從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)。這時(shí),我們可以通過(guò)SELECT語(yǔ)句來(lái)實(shí)現(xiàn)。下面是一個(gè)查詢(xún)id為1的數(shù)據(jù)的例子:
“`c++
query.exec(“SELECT * FROM user WHERE id=1”);
while(query.next()) {
int id = query.value(0).toInt();
QString name = query.value(1).toString();
int age = query.value(2).toInt();
qDebug()
}
“`
我們執(zhí)行了SELECT語(yǔ)句,查詢(xún)id為1的數(shù)據(jù),并通過(guò)while循環(huán)遍歷查詢(xún)結(jié)果。在循環(huán)中,我們通過(guò)query.value(i)方法獲取第i列的數(shù)據(jù),并根據(jù)數(shù)據(jù)類(lèi)型將其轉(zhuǎn)換為對(duì)應(yīng)的類(lèi)型。在這個(gè)例子中,我們獲取了id、name、age三列的數(shù)據(jù),并將其打印出來(lái)。
除了SELECT語(yǔ)句,還可以通過(guò)UPDATE、DELETE等語(yǔ)句來(lái)更新或刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
3. 數(shù)據(jù)庫(kù)導(dǎo)出
除了查詢(xún)和更新操作,我們還可以將數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出為CSV文件。CSV文件的全稱(chēng)為Comma-Separated Values,即用逗號(hào)將每個(gè)單元格的數(shù)據(jù)分隔開(kāi)來(lái),并在每行的末尾添加一個(gè)換行符。在Qt中,我們可以通過(guò)QTextStream來(lái)將數(shù)據(jù)寫(xiě)入CSV文件中,以下是一段導(dǎo)出user表的代碼:
“`c++
QFile file(“user.csv”);
if(file.open(QFile::WriteOnly|QFile::Truncate)) {
QTextStream out(&file);
QSqlQuery query(“SELECT * FROM user”);
out
while(query.next()) {
out
}
}
“`
在這個(gè)例子中,我們首先創(chuàng)建一個(gè)QFile對(duì)象file,并打開(kāi)其寫(xiě)入權(quán)限(QFile::WriteOnly),同時(shí)清空文件內(nèi)容(QFile::Truncate)。接著,我們創(chuàng)建一個(gè)QTextStream對(duì)象out,并將其與file綁定。然后,我們執(zhí)行SELECT語(yǔ)句,查詢(xún)user表中的所有數(shù)據(jù),并通過(guò)out將字段名稱(chēng)寫(xiě)入CSV文件中。我們遍歷查詢(xún)結(jié)果,并將其寫(xiě)入CSV文件中。
二、PDF報(bào)表生成
Qt中還提供了豐富的PDF報(bào)表生成工具,可以方便地將數(shù)據(jù)輸出為PDF格式。我們主要介紹以下兩種PDF報(bào)表生成工具:QPnter和QPrinter。
1. QPnter
QPnter是Qt中專(zhuān)門(mén)用于圖形繪制的類(lèi),我們可以通過(guò)QPnter將數(shù)據(jù)繪制到PDF中。下面是一個(gè)簡(jiǎn)單的例子:
“`c++
QPrinter printer;
printer.setOutputFileName(“user.pdf”);
printer.setPageSize(QPrinter::A4);
printer.setOutputFormat(QPrinter::PdfFormat);
QPnter pnter;
pnter.begin(&printer);
pnter.drawText(100, 100, “This is a test.”);
pnter.end();
“`
在上述代碼中,我們首先創(chuàng)建了一個(gè)QPrinter對(duì)象printer,并指定了輸出文件名、頁(yè)面大小、輸出格式。之后,我們創(chuàng)建了一個(gè)QPnter對(duì)象pnter,并調(diào)用其begin方法與printer綁定。接著,我們通過(guò)QPnter繪制了一個(gè)文本對(duì)象,最后調(diào)用pnter.end()結(jié)束繪制,將數(shù)據(jù)保存到文件中。
除了drawText方法,QPnter還支持很多其他的繪制方法,例如繪制線條、矩形、圓形、圖像等。
2. QPrinter
QPrinter是QPnter的一個(gè)子類(lèi),它是用于管理打印機(jī)和打印設(shè)置的類(lèi)。我們可以通過(guò)它的屬性來(lái)設(shè)置頁(yè)面大小、方向、邊距等。下面是一個(gè)例子:
“`c++
QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(“user.pdf”);
QTextDocument doc;
doc.setHtml(“
This is a test.
“);
doc.print(&printer);
“`
在這個(gè)例子中,我們創(chuàng)建了一個(gè)QPrinter對(duì)象printer,并指定了輸出格式為PDF格式,輸出文件名為user.pdf。我們還創(chuàng)建了一個(gè)QTextDocument對(duì)象doc,并通過(guò)setHtml方法設(shè)置其內(nèi)容為一個(gè)標(biāo)題。我們調(diào)用doc.print(&printer)方法將QTextDocument對(duì)象打印到PDF文件中。
除了print方法外,QPrinter還支持printDialog和setup等方法,用于打印機(jī)設(shè)置和頁(yè)面設(shè)置。
三、綜合應(yīng)用:數(shù)據(jù)庫(kù)操作和PDF報(bào)表生成
在本節(jié)中,我們將介紹如何將數(shù)據(jù)庫(kù)操作和PDF報(bào)表生成結(jié)合起來(lái),實(shí)現(xiàn)從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)并生成PDF報(bào)表的功能。這需要我們使用到Qt中的信號(hào)與槽機(jī)制,以下是一個(gè)完整的例子:
“`c++
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class MnWindow : public QMnWindow {
Q_OBJECT
public:
explicit MnWindow(QWidget *parent = 0);
private:
void createModel();
void createView();
void createPdf();
QSqlTableModel *model;
QTableView *view;
QWidget *centralWidget;
QVBoxLayout *vLayout;
QHBoxLayout *hLayout;
QPushButton *pdfBtn;
private slots:
void pdfClicked();
};
MnWindow::MnWindow(QWidget *parent) : QMnWindow(parent) {
createModel();
createView();
centralWidget = new QWidget(this);
vLayout = new QVBoxLayout(centralWidget);
hLayout = new QHBoxLayout();
pdfBtn = new QPushButton(tr(“Export as PDF”), centralWidget);
pdfBtn->setFixedSize(100, 30);
hLayout->addStretch();
hLayout->addWidget(pdfBtn);
vLayout->addWidget(view);
vLayout->addLayout(hLayout);
setCentralWidget(centralWidget);
connect(pdfBtn, SIGNAL(clicked()), this, SLOT(pdfClicked()));
}
void MnWindow::createModel() {
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
db.setDatabaseName(“test.db”);
if(!db.open()) {
qWarning()
}
model = new QSqlTableModel(this, db);
model->setTable(“user”);
model->select();
}
void MnWindow::createView() {
view = new QTableView(this);
view->setModel(model);
view->setFixedSize(400, 300);
}
void MnWindow::createPdf() {
QString fileName = QFileDialog::getSaveFileName(this,
tr(“Export PDF”), QString(), “*.pdf”);
if(!fileName.isEmpty()) {
QPrinter printer(QPrinter::HighResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(fileName);
QTextDocument doc;
doc.setHtml(“
User Information
“);
QSqlQuery query(“SELECT * FROM user”);
while(query.next()) {
doc.setHtml(doc.toHtml() +
“
” + query.value(0).toString() +
“, ” + query.value(1).toString() +
“, ” + query.value(2).toString() + “
“);
}
doc.print(&printer);
}
}
void MnWindow::pdfClicked() {
createPdf();
}
int mn(int argc, char *argv[]) {
QApplication a(argc, argv);
MnWindow w;
w.show();
return a.exec();
}
#include “mn.moc”
“`
在以上代碼中,我們首先創(chuàng)建了一個(gè)MnWindow類(lèi),該類(lèi)繼承自QMnWindow類(lèi)。在MnWindow類(lèi)中,我們創(chuàng)建了一個(gè)QSqlTableModel對(duì)象model,并將其與SQLite數(shù)據(jù)庫(kù)綁定,之后將其綁定到QTableView對(duì)象view上。我們還創(chuàng)建了一個(gè)QPushButton對(duì)象pdfBtn,并添加到了一個(gè)QHBoxLayout對(duì)象中。最終我們通過(guò)setLayout方法將view和pdfBtn綁定到一個(gè)QWidget對(duì)象centralWidget上,并將其設(shè)置為主窗口的中心部件,這樣我們就完成了主窗口的構(gòu)造。
接著,我們通過(guò)connect方法將pdfBtn的clicked信號(hào)和pdfClicked槽函數(shù)綁定。在pdfClicked槽函數(shù)中,我們創(chuàng)建了一個(gè)QString對(duì)象fileName,并調(diào)用QFileDialog的getSaveFileName方法來(lái)獲取輸出文件名。如果用戶(hù)選擇了一個(gè)有效的文件名,我們就創(chuàng)建了一個(gè)QPrinter對(duì)象printer,并將輸出格式設(shè)置為PDF格式,輸出文件名設(shè)置為fileName。之后,我們創(chuàng)建了一個(gè)QTextDocument對(duì)象doc,并設(shè)置其內(nèi)容為一個(gè)標(biāo)題,“User Information”,之后通過(guò)SELECT語(yǔ)句查詢(xún)user表中的所有數(shù)據(jù),并將其添加到QTextDocument對(duì)象doc中,最后調(diào)用doc.print(&printer)方法將其輸出到PDF文件中,并完成報(bào)表輸出工作。
四、結(jié)論
相關(guān)問(wèn)題拓展閱讀:
- qt5編寫(xiě)pdf閱讀器,怎么編譯poppler
qt5編寫(xiě)pdf閱讀器,怎么編譯poppler
可以參考這篇博客畢棗鄭,windows下直巖旦接手頌使用博主提供的庫(kù),linux下也有對(duì)應(yīng)的安裝包,
Qt博客
一般分為動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),方法分別如渣拆下: 一. 靜態(tài)庫(kù)的生成脊汪 1. 測(cè)試目錄: lib 2. 源碼文件名: mywindow.h, mywindow.cpp 3. 編櫻梁仔寫(xiě)項(xiàng)目文件: mywindow.pro 注意兩點(diǎn): TEMPLATE = lib CONFIG += staticlib 4. 生成Makefile: qmake mywindow.pro 5
關(guān)于qt 讀取數(shù)據(jù)庫(kù)生成pdf的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開(kāi)通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專(zhuān)業(yè)-網(wǎng)站建設(shè),軟件開(kāi)發(fā)老牌服務(wù)商!微信小程序開(kāi)發(fā),APP開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站營(yíng)銷(xiāo)推廣服務(wù)眾多企業(yè)。電話:028-86922220
網(wǎng)頁(yè)題目:Qt編程技術(shù):數(shù)據(jù)庫(kù)操作生成PDF報(bào)表 (qt 讀取數(shù)據(jù)庫(kù)生成pdf)
文章出自:http://m.5511xx.com/article/cosgjoh.html


咨詢(xún)
建站咨詢(xún)
