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文件中,并完成报表输出工作。

四、结论


数据运维技术 » Qt编程技术:数据库操作生成PDF报表 (qt 读取数据库生成pdf)