Qt打印数据库中的表格
实现方法 连接数据库,用QTableModel显示数据库的表格,然后将表格转为html,然后再进行打印,打印的方法是参考以下链接完成的:
Qt中(HTML)实现数据表格打印功能
输出
主界面
文章图片
打印结果
文章图片
代码
PrintTest.pro
QT+= core gui sql printsupportgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000# disables all the APIs deprecated before Qt 6.0.0SOURCES += \
main.cpp \
qprintermanager.cpp \
widget.cppHEADERS += \
qprintermanager.h \
widget.hFORMS += \
widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
qprintermanager.h
#ifndef QPRINTERMANAGER_H
#define QPRINTERMANAGER_H#include
#include
#include
#include class QPrinterManager : public QObject
{
Q_OBJECT
public:
explicit QPrinterManager(QObject *parent = nullptr);
~QPrinterManager(){}
void setCharSet(const QString &set = QString("utf-8")){ m_charSet = set;
}
void dataBegin();
void dataEnd(){ out << QString("");
}
// 添加主标题(两行:第一行居中显示文字,第二行居右显示时间)
void insertTitle(const QString &title);
// 添加次级标题
void insertTitle2(const QString &title2);
// 空出一行
void insertSeperator(){ out << QString("
\n");
}
// 不支持嵌套TABLE
void tableBegin(const QStringList &head);
void tableEnd(){ out << QString("\n");
}
void insert2TableRow(const QStringList &rowData);
void printWithPreview();
// 带预览
void printDirect();
// 直接打印,不带预览private:
void resetState();
private slots:
void getPreviewData(QPrinter *printer);
private:
QString m_charSet;
QString m_data;
QTextStream out;
};
#endif // QPRINTERMANAGER_H
qprintermanager.cpp
#include "qprintermanager.h"
#include
#include
#include
#include
#include
#include QPrinterManager::QPrinterManager(QObject *parent) : QObject(parent), m_charSet("utf-8")
{
out.setString(&m_data);
}void QPrinterManager::dataBegin()
{
out << QString("")
<< QString("")
<< QString("").arg(m_charSet)
<< QString("")
<< QString("");
}void QPrinterManager::insertTitle(const QString &title)
{
out << QString("%1
\n")
.arg(title)
<< QString("打印时间:%1
\n")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
}void QPrinterManager::insertTitle2(const QString &title2)
{
out << QString("-%1
\n")
.arg(title2);
}
void QPrinterManager::tableBegin(const QStringList &head)
{
out << QString("")
<< QString("\n")
<< QString("\n");
for (int i = 0;
i < head.count();
++i)
{
out << QString("%1
\n")
.arg(head.at(i));
}
out << " \n";
}void QPrinterManager::insert2TableRow(const QStringList &rowData)
{
out << QString("\n");
for (int i = 0;
i < rowData.count();
++i)
{
out << QString("%1
\n")
.arg(rowData.at(i));
}
out << QString(" \n");
}void QPrinterManager::printWithPreview()
{
QPrinter printer(QPrinter::ScreenResolution);
//由于一列的数据项数过多,将打印预览页面设置为水平
printer.setOrientation(QPrinter::Landscape);
//设置页边距
printer.setPageMargins(2, 2, 6, 6, QPrinter::Millimeter);
printer.setPageSize(QPrinter::A4);
QPrintPreviewDialog preview(&printer);
connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(getPreviewData(QPrinter*)));
preview.setWindowState(Qt::WindowMaximized);
preview.exec();
resetState();
}void QPrinterManager::printDirect()
{
QPrinter printer(QPrinter::ScreenResolution);
printer.setPageSize(QPrinter::A4);
QPrintDialog printDialog(&printer);
if (printDialog.exec() == QDialog::Accepted)
{
getPreviewData(&printer);
}
resetState();
}void QPrinterManager::resetState()
{
m_data.clear();
m_charSet = "utf-8";
}void QPrinterManager::getPreviewData(QPrinter *printer)
{
QTextDocument document;
document.setHtml(m_data);
document.print(printer);
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include
#include "qprintermanager.h"
#include QT_BEGIN_NAMESPACE
namespace Ui { class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{
Q_OBJECTpublic:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_buttonPrint_clicked();
private:
Ui::Widget *ui;
QSqlTableModel *model;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
#include
#include
#include using namespace std;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("Print Test");
//SQLite数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("../test.db");
if(!db.open())
{
QMessageBox::warning(this, "error", db.lastError().text());
qDebug()<tableView);
model->setTable("StuInfo");
//选择表
//把model放在view里面
ui->tableView->setModel(model);
model->select();
//设置model1编辑模式为手动提交修改
//model1->setEditStrategy(QSqlTableModel::OnManualSubmit);
//只读
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
//表格宽度随内容调整
ui->tableView->horizontalHeader()
->setSectionResizeMode(QHeaderView::ResizeToContents);
}Widget::~Widget()
{
delete ui;
}
//按下打印按钮
void Widget::on_buttonPrint_clicked()
{
int rowNum=model->rowCount();
QString title1=QString("Student Information");
//打印表格的标题
QStringList columnList;
//columnList为各列名
vector dataLists;
//dataLists为各行数据
columnList<<"name"<<"age"<<"ID";
for(int i=0;
irecord(i).value(j).toString();
}
dataLists.push_back(data);
}
QPrinterManager PM;
PM.dataBegin();
PM.insertTitle(title1);
PM.insertTitle2("blank_shen");
PM.tableBegin(columnList);
for(int row=0;
row
【Qt打印数据库中的表格】参考链接:
Qt中(HTML)实现数据表格打印功能
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 热闹中的孤独
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗