Qt编程技术:数据库操作生成PDF报表 (qt 读取数据库生成pdf)
Qt是一个跨平台的图形用户界面应用程序开发框架,可用于开发移动设备、桌面应用程序、嵌入式系统等多种软件。Qt中有很多方便的工具,其中包括数据库操作和PDF报表生成工具。在这篇文章中,我们将专注于如何使用Qt的这两个工具结合起来,实现数据库操作并生成PDF报表。
一、数据库操作
Qt中内置了很多的数据库类,支持多种数据库,包括MySQL、SQLite、PostgreSQL等。我们以SQLite为例,讲述如何实现与数据库操作。
1. SQLite数据库
SQLite是一种轻量级的关系型数据库管理系统,主要特点是不需要安装和配置,同时具有极高的性能。它最适合于嵌入式设备和移动设备上的应用程序。
在Qt中,我们可以通过QSqlDatabase来连接SQLite数据库。首先需要在项目中添加如下代码:
“`c++
#include
#include
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
db.setDatabaseName(“test.db”);
if(!db.open()) {
qWarning()
}
“`
以上代码中,我们首先include了QSqlDatabase和QDebug类。接着,我们创建了一个QSqlDatabase对象db,并指定了它连接的数据库类型为SQLite。然后我们通过setDatabaseName方法指定了SQLite数据库的名称为test.db,也可以指定其他的数据库名称。如果连接成功,open()函数会返回true,否则返回false。如果连接失败,我们通过qWarning()打印一条错误信息。
之后,我们还需要执行SQL语句,可以通过QSqlQuery来实现。下面是一段简单的SQL语句:
“`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)”);
“`
在上述代码中,我们首先创建一个QSqlQuery对象query,之后通过SQL语句创建了一个名为user的表,并插入了一条id为1,name为Tom,age为18的数据。
到此为止,我们已经成功地实现了与SQLite数据库的连接和数据插入操作。但是,这并不足以说明Qt的数据库操作功能。
2. 数据库查询
在实际应用中,我们通常需要从数据库中读取数据。这时,我们可以通过SELECT语句来实现。下面是一个查询id为1的数据的例子:
“`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()
}
“`
我们执行了SELECT语句,查询id为1的数据,并通过while循环遍历查询结果。在循环中,我们通过query.value(i)方法获取第i列的数据,并根据数据类型将其转换为对应的类型。在这个例子中,我们获取了id、name、age三列的数据,并将其打印出来。
除了SELECT语句,还可以通过UPDATE、DELETE等语句来更新或删除数据库中的数据。
3. 数据库导出
除了查询和更新操作,我们还可以将数据库中的数据导出为CSV文件。CSV文件的全称为Comma-Separated Values,即用逗号将每个单元格的数据分隔开来,并在每行的末尾添加一个换行符。在Qt中,我们可以通过QTextStream来将数据写入CSV文件中,以下是一段导出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
}
}
“`
在这个例子中,我们首先创建一个QFile对象file,并打开其写入权限(QFile::WriteOnly),同时清空文件内容(QFile::Truncate)。接着,我们创建一个QTextStream对象out,并将其与file绑定。然后,我们执行SELECT语句,查询user表中的所有数据,并通过out将字段名称写入CSV文件中。我们遍历查询结果,并将其写入CSV文件中。
二、PDF报表生成
Qt中还提供了丰富的PDF报表生成工具,可以方便地将数据输出为PDF格式。我们主要介绍以下两种PDF报表生成工具:QPnter和QPrinter。
1. QPnter
QPnter是Qt中专门用于图形绘制的类,我们可以通过QPnter将数据绘制到PDF中。下面是一个简单的例子:
“`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();
“`
在上述代码中,我们首先创建了一个QPrinter对象printer,并指定了输出文件名、页面大小、输出格式。之后,我们创建了一个QPnter对象pnter,并调用其begin方法与printer绑定。接着,我们通过QPnter绘制了一个文本对象,最后调用pnter.end()结束绘制,将数据保存到文件中。
除了drawText方法,QPnter还支持很多其他的绘制方法,例如绘制线条、矩形、圆形、图像等。
2. QPrinter
QPrinter是QPnter的一个子类,它是用于管理打印机和打印设置的类。我们可以通过它的属性来设置页面大小、方向、边距等。下面是一个例子:
“`c++
QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(“user.pdf”);
QTextDocument doc;
doc.setHtml(“
This is a test.
“);
doc.print(&printer);
“`
在这个例子中,我们创建了一个QPrinter对象printer,并指定了输出格式为PDF格式,输出文件名为user.pdf。我们还创建了一个QTextDocument对象doc,并通过setHtml方法设置其内容为一个标题。我们调用doc.print(&printer)方法将QTextDocument对象打印到PDF文件中。
除了print方法外,QPrinter还支持printDialog和setup等方法,用于打印机设置和页面设置。
三、综合应用:数据库操作和PDF报表生成
在本节中,我们将介绍如何将数据库操作和PDF报表生成结合起来,实现从数据库中读取数据并生成PDF报表的功能。这需要我们使用到Qt中的信号与槽机制,以下是一个完整的例子:
“`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”
“`
在以上代码中,我们首先创建了一个MnWindow类,该类继承自QMnWindow类。在MnWindow类中,我们创建了一个QSqlTableModel对象model,并将其与SQLite数据库绑定,之后将其绑定到QTableView对象view上。我们还创建了一个QPushButton对象pdfBtn,并添加到了一个QHBoxLayout对象中。最终我们通过setLayout方法将view和pdfBtn绑定到一个QWidget对象centralWidget上,并将其设置为主窗口的中心部件,这样我们就完成了主窗口的构造。
接着,我们通过connect方法将pdfBtn的clicked信号和pdfClicked槽函数绑定。在pdfClicked槽函数中,我们创建了一个QString对象fileName,并调用QFileDialog的getSaveFileName方法来获取输出文件名。如果用户选择了一个有效的文件名,我们就创建了一个QPrinter对象printer,并将输出格式设置为PDF格式,输出文件名设置为fileName。之后,我们创建了一个QTextDocument对象doc,并设置其内容为一个标题,“User Information”,之后通过SELECT语句查询user表中的所有数据,并将其添加到QTextDocument对象doc中,最后调用doc.print(&printer)方法将其输出到PDF文件中,并完成报表输出工作。
四、结论