本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Qt 修改QPrintPreviewWidget背景颜色
Qt 开发搞旧了,终归是要来到打印的环节的,如果没有,那就是还不够旧。今天终于解决了好久之前挖的坑了,第一次使用QPrintPreviewWidget
,背景怎么也搞不定,最终还是在群里得到大佬指点,才可以实现,不过不是透明,而是投机的透明。
[TOC]
关键字:
QPrintPreviewWidget
、Qt
、样式表
、qss
、背景
代码核心
其实核心代码很简单,还是Qss,这是我开始走错了方向。代码如下:
mPrintPreviewWidget->setStyleSheet("QGraphicsView {qproperty-backgroundBrush: #151740;border:0px}");
这里我使用了程序的背景色来填充,把边框设置成0px。
这样就可以,上下对比图
未实现前
实现后
打印机初始化
初始化打印机,在测试过程中,很耗时,所以我这里把它移入到了线程里面
void MPrinter::run()
{
if(!mPdfPrinter)
{
mPdfPrinter = new QPrinter();
mPdfPrinter->setPageSize(QPageSize(QPageSize::A4)); // 设置纸张大小
mPdfPrinter->setResolution(300);
mPdfPrinter->setPageMargins(QMarginsF(10,10,10,10)); // 设置页边距
mPdfPrinter->setPageOrientation(QPageLayout::Orientation::Portrait); // 设置纸张方向
emit signalQPrinterNewFinished();
}
}
线程类也很简蛋,就只一个打印机指针。如下
class MPrinter : public QThread
{
Q_OBJECT
public:
QPrinter* mPdfPrinter = nullptr;
void run();
signals:
void signalQPrinterNewFinished();
};
初始化也很重要
/**
* @brief Turing_Report_Kernel::initKernel
* 打印模块初始化
*/
void Turing_Report_Kernel::initKernel()
{
mPrinter = new MPrinter();
connect(mPrinter,&MPrinter::signalQPrinterNewFinished,this,[=](){
if(mPrintPreviewWidget)
{
QLayoutItem *item = nullptr;
while((item = ui->verticalLayout->takeAt(0)) != nullptr) // 清空layout元素
{
delete item;
}
delete mPrintPreviewWidget;
mPrintPreviewWidget = nullptr; // 需要删除后,再创建,才能刷新,触发repaint
}
if(!mPrintPreviewWidget)
{
mPrintPreviewWidget = new QPrintPreviewWidget(mPrinter->mPdfPrinter,ui->widget);
mPrintPreviewWidget->setStyleSheet("QGraphicsView {qproperty-backgroundBrush: #151740;border:0px}");
// mPrintPreviewWidget->setStyleSheet("QGraphicsView {qproperty-backgroundBrush: rgba(0,0,0,20);border:0px}");
mPrintPreviewWidget->setAttribute(Qt::WA_TranslucentBackground);
mPrintPreviewWidget->setViewMode(QPrintPreviewWidget::SinglePageView);
mPrintPreviewWidget->setZoomMode(QPrintPreviewWidget::FitInView); // FitInView:根据视野大小,自动缩放,会完整显示一页;FitToWidth:根据宽度缩放,会无法完整显示一页
ui->verticalLayout->addWidget(mPrintPreviewWidget);
}
connect(mPrintPreviewWidget, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slot_previewPdfOnWidget(QPrinter*)));
mPrintPreviewWidget->repaint();
});
mPrinter->start();
}