Qt做多了没有人逃得过打印模板这个功能,有的话只是时候未到,注释都在代码里了,直接上代码了
1、获取打印机的名称
if(index == 1)
{
QPrinterInfo info;
QStringList list = info.availablePrinterNames(); // 所有打印机名字
ui->cB_print->clear();
ui->cB_print->setEnabled(true);
foreach (QString str, list) {
ui->cB_print->addItem(str);
}
}
else
{
QPrinterInfo info;
QString name = info.defaultPrinterName(); // 默认打印机名字
ui->cB_print->clear();
ui->cB_print->setEnabled(false);
ui->cB_print->addItem(name);
}
2、预览
QPrinter printer(QPrinter::HighResolution);
//自定义纸张大小,特别重要,不然预览效果极差
printer.setPageSize(QPrinter::Custom);
printer.setPaperSize(QSizeF(600, 800),
QPrinter::Point);
QPrintPreviewDialog preview(&printer, this);// 创建打印预览对话框
preview.setMinimumSize(1000,600);
/*
* QPrintPreviewDialog类提供了一个打印预览对话框,里面功能比较全,
* paintRequested(QPrinter *printer)是系统提供的,
* 当preview.exec()执行时该信号被触发,
* drawPic(QPrinter *printer)是自定义的槽函数,图像的绘制就在这个函数里。
*/
connect(&preview, SIGNAL(paintRequested(QPrinter*)), SLOT(drawPic(QPrinter*)));
preview.exec();
然后drawPic定义:
//在预览窗口显示图片
void MainWindow::drawPic(QPrinter *printerPixmap)
{
QPixmap pix = QPixmap(800,600);
//这个函数算是画模板的函数吧,毕竟打印时有模板的
createPix(&pix);
pix.save(sFilePix);
//纵向:Portrait 横向:Landscape
printerPixmap->setOrientation(QPrinter::Landscape);
//获取界面的图片
QPainter painterPixmap(this);
painterPixmap.begin(printerPixmap);
QRect rect = painterPixmap.viewport();
int x = rect.width() / pix.width();
int y = rect.height() / pix.height();
//设置图像长宽是原图的多少倍
painterPixmap.scale(x, y);
painterPixmap.drawPixmap(0, 0, pix);
painterPixmap.end();
}
void MainWindow::createPix(QPixmap *pix)
{
QPainter *painter = new QPainter(this);
painter->begin(pix);
painter->setRenderHint(QPainter::Antialiasing, true);
// 设置画笔颜色、宽度
painter->setPen(QPen(QColor(255, 255, 255), 2));
// 设置画刷颜色
painter->setBrush(QColor(255, 255, 255));
QRect rect(0,0,800,600);
//整张图设置画刷白底
painter->fillRect(rect,QColor(255, 255, 255));
painter->drawRect(rect);
//画数据部分的线条
painter->setPen(QPen(QColor(0, 0, 0), 1));
QVector<QLine> lines;
lines.append(QLine(QPoint(50,50),QPoint(750,50)));//上边
lines.append(QLine(QPoint(750,50),QPoint(750,550)));//