原文网址:http://www.dazzle.plus.com/linux/QtCreator/part11.htm
第11部份:打印和打印预览
Qt应用程序的打印和打印预览
要支持打印和生成打印预览,我们只需要增强类MainWindow。我们要打印输出将是用一张单独页面显示场景的模拟景观和页面角落的标签。这些工作将由Qt类QPrinter,QPrintPreviewDialog和QPrintDialog来实现。我们也将添加两个新的文件菜单项“打印预览...”和“打印...”。
修改类MainWindow
添加类QPrinter的前置定义。
class QPrinter;
添加三个公共槽定义。分别对应于菜单选项打印动作,打印预览动作和绘制打印页面。
void filePrintPreview(); //打印预览窗口
void filePrint(); //打印窗口
void print( QPrinter* ); // 绘制打印页面
引入类QPrinter,QPrintPreviewDialog和QPrintDialog的头文件。
#include <QPrinter>
#include <QPrintPreviewDialog>
#include <QPrintDialog>
在构造函数里,在打开和保存的文件菜单项下面,我们新增一个分隔符,“打印”和“打印预览”菜单项。
fileMenu->addSeparator();
QAction* previewAction = fileMenu->addAction( "Print pre&view...", this, SLOT(filePrintPreview()) );
QAction* printAction = fileMenu->addAction( "&Print...", this, SLOT(filePrint()) );
仍然要在构造函数里为打印动作创建键盘快捷键。
printAction->setShortcut( QKeySequence::Print );
现在我们添加打印预览代码。在这里,我们创建一个QPrinter对象用于打印机绘制和一个打印预览对话框。我们连接打印对话框和打印槽方法,并把控制权传递给这个对话框。
/********************************* filePrintPreview **********************************/
void MainWindow::filePrintPreview()
{
// 打印预览对话框
QPrinter printer( QPrinter::HighResolution );
QPrintPreviewDialog preview( &printer, this );
connect( &preview, SIGNAL(paintRequested(QPrinter*)), SLOT(print(QPrinter*)) );
preview.exec();
}
我们添加打印对话框公共槽代码。在这里,我们新建一个QPrinter对象和打印对话框。如果用户想要打印那么应用程序就打印。
/************************************ filePrint **************************************/
void MainWindow::filePrint()
{
// 打印对话框
QPrinter printer( QPrinter::HighResolution );
QPrintDialog dialog( &printer, this );
if ( dialog.exec() == QDialog::Accepted ) print( &printer );
}
在这里,我们将添加用于打印预览对话框和打印对话框的打印机打印代码。我们创建打印机绘制对象和设置页面大小。然后我们依据页面大小设置适当的字体大小和在页面的三个角落绘制标签。最后我们把用于绘制或者模拟景观的场景放在页面的中间。
/*************************************** print ***************************************/
void MainWindow::print( QPrinter* printer )
{
// 创建打印页面的绘制对象
QPainter painter( printer );
int w = printer->pageRect().width();
int h = printer->pageRect().height();
QRect page( 0, 0, w, h );
// 根据页面大小设置适当的字体大小
QFont font = painter.font();
font.setPixelSize( (w+h) / 100 );
painter.setFont( font );
// 在页面角落绘制标签
painter.drawText( page, Qt::AlignTop | Qt::AlignLeft, "QSimulate" );
painter.drawText( page, Qt::AlignBottom | Qt::AlignLeft, QString(getenv("USER")) );
painter.drawText( page, Qt::AlignBottom | Qt::AlignRight,
QDateTime::currentDateTime().toString( Qt::DefaultLocaleShortDate ) );
// 绘制模拟数据
page.adjust( w/20, h/20, -w/20, -h/20 );
m_scene->render( &painter, page );
}
编译与运行
当你尝试运行程序新的代码将自动被编译。测试程序,检测新功能。Qt的打印系统也可以生成PostScript和PDF文档。