qt5 appendpython 打印空格的数据怎么用空格分开

实现方法:
单独起一个线程,用于读取按键代码,读取后转换为Qt::Keys,然后使用
QApplication::postEvent((QObject*)tFocusObj,tTabKeyPress);
进行分发到当前具有焦点的窗体上。
#include &zkeypadthread.h&
ZKeyPadThread::ZKeyPadThread(QObject *parent) :
&&& QObject(parent)
&&& this-&m_udpSocket=new QUdpS
&&& connect(this-&m_udpSocket,SIGNAL(readyRead()),this,SLOT(ZSlotReadUDPPacket()));
ZKeyPadThread::~ZKeyPadThread()
&&& delete this-&m_udpS
qint32 ZKeyPadThread::ZStartListen()
&&& if(this-&m_udpSocket-&bind(QHostAddress::Any,1986))
&&&&&&& return 0;
&&& }else{
&&&&&&& return -1;
qint32 ZKeyPadThread::ZStopListen()
&&& this-&m_udpSocket-&disconnectFromHost();
&&& this-&m_udpSocket-&close();
&&& return 0;
void ZKeyPadThread::ZSlotReadUDPPacket()
&&& QByteArray tUDPSyncHeader(&EAVKeyPad&);
&&& QByteArray tRecvB
&&& tRecvBuffer.resize(this-&m_udpSocket-&pendingDatagramSize());
&&& this-&m_udpSocket-&readDatagram(tRecvBuffer.data(),tRecvBuffer.size());
&&& if(!tRecvBuffer.startsWith(tUDPSyncHeader))
&&&&&&& qDebug()&&&unknow udp sync header!&;
&&& qDebug()&&tRecvB
&&& tRecvBuffer.remove(0,tUDPSyncHeader.size());
&&& qDebug()&&tRecvB
&&& for(qint32 i=0;i&tRecvBuffer.size();i++)
&&&&&&& qDebug()&&tRecvBuffer.at(i);
&&&&&&& qint32 tKeyCode=0;
&&&&&&& switch(tRecvBuffer.at(i))
&&&&&&& case ZKeyPadThread::ZKeyPad_Top:
&&&&&&&&&&& tKeyCode=Qt::Key_Up;
&&&&&&&&&&&
&&&&&&& case ZKeyPadThread::ZKeyPad_Bottom:
&&&&&&&&&&& tKeyCode=Qt::Key_D
&&&&&&&&&&&
&&&&&&& case ZKeyPadThread::ZKeyPad_Left:
&&&&&&&&&&& tKeyCode=Qt::Key_L
&&&&&&&&&&&
&&&&&&& case ZKeyPadThread::ZKeyPad_Right:
&&&&&&&&&&& tKeyCode=Qt::Key_R
&&&&&&&&&&&
&&&&&&& case ZKeyPadThread::ZKeyPad_Enter:
&&&&&&&&&&& tKeyCode=Qt::Key_E
&&&&&&&&&&&
&&&&&&& case ZKeyPadThread::ZKeyPad_Return:
&&&&&&&&&&& tKeyCode=Qt::Key_E
&&&&&&&&&&&
&&&&&&& default:
&&&&&&&&&&&
&&&&&&& //post key event.
&&&&&&& QWidget *tFocusObj=QApplication::activeWindow();
&&&&&&& if(tFocusObj)
&&&&&&&&&&& QKeyEvent *tTabKeyPress=new QKeyEvent( QEvent::KeyPress,tKeyCode,Qt::NoModifier);
&&&&&&&&&&& QApplication::postEvent((QObject*)tFocusObj,tTabKeyPress);
然后在主窗体上使用二组数据组织各个部件,(x,y),
根据上下左右控制x和y的+1或-1,然后赋予某个部件焦点。
#ifndef ZHOMENAVIGATOR_H
#define ZHOMENAVIGATOR_H
#include &QFrame&
#include &QGridLayout&
#include &BaseParts/zcoolbutton.h&
#include &MainUI/zfilemanager.h&
#include &MainUI/zsystemsetup.h&
#include &MainUI/zdatetimesetup.h&
#include &Parameters/zparameters.h&
#include &QHash&
#include &QList&
#include &QPoint&
typedef struct
&&& QWidget *
class ZHomeNavigator : public QFrame
&&& Q_OBJECT
&&& explicit ZHomeNavigator(QWidget *parent = 0);
&&& ~ZHomeNavigator();
protected:
&&& void keyPressEvent(QKeyEvent *event);
&&& void keyReleaseEvent(QKeyEvent *event);
&&& void ZSignalReturnButtonClicked();
public slots:
&&& void ZSlotShowFileManager();
&&& void ZSlotShowSystemSetup();
&&& void ZSlotShowDateTimeSetup();
&&& void ZAddWidgetToKeyList(qint32 x,qint32 y,QWidget *widget);
&&& QToolButton *m_btnFileM
&&& QToolButton *m_btnSysetmS
&&& QToolButton *m_btnW
&&& QToolButton *m_btnDateT
&&& QToolButton *m_btnDevL
&&& QToolButton *m_btnB
&&& QToolButton *m_btnS
&&& QToolButton *m_btnS
&&& QToolButton *m_btnR
&&& QGridLayout *m_gridL
&&& //keys move hash.
&&& QList&ZKeyElement& m_keysL
&&& QPoint m_currentK
&&& qint32 m_KeyRowC
&&& qint32 m_KeyColC
#endif // ZHOMENAVIGATOR_H
#include &zhomenavigator.h&
ZHomeNavigator::ZHomeNavigator(QWidget *parent) :
&&& QFrame(parent)
&&& this-&setObjectName(&ZHomeNavigator&);
&&& this-&setFocusPolicy(Qt::StrongFocus);
&&& this-&m_btnFileManager=new QToolB
&&& this-&m_btnFileManager-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnFileManager-&setIconSize(QSize(48,48));
&&& this-&m_btnFileManager-&setIcon(QIcon(&:/images/znavigator_filemanager.png&));
&&& this-&m_btnFileManager-&setText(tr(&Videos&));
&&& connect(this-&m_btnFileManager,SIGNAL(clicked()),this,SLOT(ZSlotShowFileManager()));
&&& this-&m_btnSysetmSetup=new QToolB
&&& this-&m_btnSysetmSetup-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnSysetmSetup-&setIconSize(QSize(48,48));
&&& this-&m_btnSysetmSetup-&setIcon(QIcon(&:/images/znavigator_setup.png&));
&&& this-&m_btnSysetmSetup-&setText(tr(&Settings&));
&&& connect(this-&m_btnSysetmSetup,SIGNAL(clicked()),this,SLOT(ZSlotShowSystemSetup()));
&&& this-&m_btnDateTime=new QToolB
&&& this-&m_btnDateTime-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnDateTime-&setIconSize(QSize(48,48));
&&& this-&m_btnDateTime-&setIcon(QIcon(&:/images/znavigator_datetime.png&));
&&& this-&m_btnDateTime-&setText(tr(&DateTime&));
&&& connect(this-&m_btnDateTime,SIGNAL(clicked()),this,SLOT(ZSlotShowDateTimeSetup()));
&&& this-&m_btnWireless=new QToolB
&&& this-&m_btnWireless-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnWireless-&setIconSize(QSize(48,48));
&&& this-&m_btnWireless-&setIcon(QIcon(&:/images/znavigator_wireless.png&));
&&& this-&m_btnWireless-&setText(tr(&Wireless&));
&&& this-&m_btnDevLog=new QToolB
&&& this-&m_btnDevLog-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnDevLog-&setIconSize(QSize(48,48));
&&& this-&m_btnDevLog-&setIcon(QIcon(&:/images/znavigator_devlog.png&));
&&& this-&m_btnDevLog-&setText(tr(&DevLog&));
&&& this-&m_btnBattery=new QToolB
&&& this-&m_btnBattery-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnBattery-&setIconSize(QSize(48,48));
&&& this-&m_btnBattery-&setIcon(QIcon(&:/images/znavigator_battery.png&));
&&& this-&m_btnBattery-&setText(tr(&Battery&));
&&& this-&m_btnSound=new QToolB
&&& this-&m_btnSound-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnSound-&setIconSize(QSize(48,48));
&&& this-&m_btnSound-&setIcon(QIcon(&:/images/znavigator_sound.png&));
&&& this-&m_btnSound-&setText(tr(&Sound&));
&&& this-&m_btnShutdown=new QToolB
&&& this-&m_btnShutdown-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnShutdown-&setIconSize(QSize(48,48));
&&& this-&m_btnShutdown-&setIcon(QIcon(&:/images/znavigator_shutdown.png&));
&&& this-&m_btnShutdown-&setText(tr(&Shutdown&));
&&& this-&m_btnReturn=new QToolB
&&& this-&m_btnReturn-&setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
&&& this-&m_btnReturn-&setIconSize(QSize(48,48));
&&& this-&m_btnReturn-&setIcon(QIcon(&:/images/znavigator_return.png&));
&&& this-&m_btnReturn-&setText(tr(&Return&));
&&& connect(this-&m_btnReturn,SIGNAL(clicked()),this,SIGNAL(ZSignalReturnButtonClicked()));
&&& //layout.
&&& this-&m_gridLayout=new QGridL
&&& this-&m_gridLayout-&addWidget(this-&m_btnFileManager,0,0,1,1);
&&& this-&m_gridLayout-&addWidget(this-&m_btnSysetmSetup,0,1,1,1);
&&& this-&m_gridLayout-&addWidget(this-&m_btnDateTime,0,2,1,1);
&&& this-&m_gridLayout-&addWidget(this-&m_btnWireless,0,3,1,1);
&&& this-&m_gridLayout-&addWidget(this-&m_btnDevLog,0,4,1,1);
&&& this-&m_gridLayout-&addWidget(this-&m_btnBattery,1,0,1,1);
&&& this-&m_gridLayout-&addWidget(this-&m_btnSound,1,1,1,1);
&&& this-&m_gridLayout-&addWidget(this-&m_btnShutdown,1,3,1,1);
&&& this-&m_gridLayout-&addWidget(this-&m_btnReturn,1,4,1,1);
&&& //layout.
&&& this-&setLayout(this-&m_gridLayout);
&&& //arrange the widgets to control by keys.
&&& this-&ZAddWidgetToKeyList(0,0,this-&m_btnFileManager);
&&& this-&ZAddWidgetToKeyList(0,1,this-&m_btnSysetmSetup);
&&& this-&ZAddWidgetToKeyList(0,2,this-&m_btnDateTime);
&&& this-&ZAddWidgetToKeyList(0,3,this-&m_btnWireless);
&&& this-&ZAddWidgetToKeyList(0,4,this-&m_btnDevLog);
&&& this-&ZAddWidgetToKeyList(1,0,this-&m_btnBattery);
&&& this-&ZAddWidgetToKeyList(1,1,this-&m_btnSound);
&&& this-&ZAddWidgetToKeyList(1,3,this-&m_btnShutdown);
&&& this-&ZAddWidgetToKeyList(1,4,this-&m_btnReturn);
&&& //the initial key element is (0,0) at default.
&&& this-&m_currentKey=QPoint(0,0);
&&& this-&m_KeyRowCount=2;//count from 1 not 0.
&&& this-&m_KeyColCount=5;//count from 1 not 0.
ZHomeNavigator::~ZHomeNavigator()
&&& delete this-&m_btnFileM
&&& delete this-&m_btnSysetmS
&&& delete this-&m_btnDateT
&&& delete this-&m_btnW
&&& delete this-&m_btnDevL
&&& delete this-&m_btnB
&&& delete this-&m_btnS
&&& delete this-&m_btnS
&&& delete this-&m_btnR
&&& delete this-&m_gridL
void ZHomeNavigator::ZAddWidgetToKeyList(qint32 x,qint32 y,QWidget *widget)
&&& ZKeyElement tKeyE
&&& tKeyElement.pos=QPoint(x,y);
&&& tKeyElement.element=
&&& this-&m_keysList.append(tKeyElement);
void ZHomeNavigator::ZSlotShowFileManager()
&&& ZFileManager tFileM
&&& tFileManager.setGeometry(this-&geometry());
&&& tFileManager.exec();
void ZHomeNavigator::ZSlotShowSystemSetup()
&&& ZSystemSetup tSystemS
&&& tSystemSetup.setGeometry(this-&geometry());
&&& //capture delay.
&&& tSystemSetup.ZSetLicensePlateCaptureDelay(gGlobalParam.licencePlateCaptureDelay);
&&& tSystemSetup.ZSetGoodsVideoCaptureDelay(gGlobalParam.goodsVideoCaptureDelay);
&&& //tcp server.
&&& tSystemSetup.ZSetTcpServerIPAddr(gGlobalParam.tcpServerIP);
&&& tSystemSetup.ZSetTcpServerPort(gGlobalParam.tcpServerPort);
&&& if(tSystemSetup.exec()==QDialog::Accepted)
&&&&&&& //update the delay parameter.
&&&&&&& gGlobalParam.licencePlateCaptureDelay=tSystemSetup.ZGetLicensePlateCaptureDelay();
&&&&&&& gGlobalParam.goodsVideoCaptureDelay=tSystemSetup.ZGetGoodsVideoCaptureDelay();
&&&&&&& //tcp server.
&&&&&&& gGlobalParam.tcpServerIP=tSystemSetup.ZGetTcpServerIPAddr();
&&&&&&& gGlobalParam.tcpServerPort=tSystemSetup.ZGetTcpServerPort();
void ZHomeNavigator::ZSlotShowDateTimeSetup()
&&& ZDateTimeSetup tDateTimeS
&&& tDateTimeSetup.setGeometry(this-&geometry());
&&& tDateTimeSetup.exec();
void ZHomeNavigator::keyPressEvent(QKeyEvent *event)
&&& switch(event-&key())
&&& case Qt::Key_Up:
&&&&&&& if(this-&m_currentKey.x()&0)
&&&&&&&&&&& this-&m_currentKey.setX(this-&m_currentKey.x()-1);
&&& case Qt::Key_Down:
&&&&&&& if(this-&m_currentKey.x()&this-&m_KeyRowCount-1)
&&&&&&&&&& this-&m_currentKey.setX(this-&m_currentKey.x()+1);
&&& case Qt::Key_Left:
&&&&&&& if(this-&m_currentKey.y()&0)
&&&&&&&&&&& this-&m_currentKey.setY(this-&m_currentKey.y()-1);
&&& case Qt::Key_Right:
&&&&&&& if(this-&m_currentKey.y()&this-&m_KeyColCount-1)
&&&&&&&&&&& this-&m_currentKey.setY(this-&m_currentKey.y()+1);
&& //find the specified widget.
&&& for(qint32 i=0;i&this-&m_keysList.count();i++)
&&&&&&& ZKeyElement tKeyElement=this-&m_keysList.at(i);
&&&&&&& if(tKeyElement.pos==this-&m_currentKey)
&&&&&&&&&&& tKeyElement.element-&setFocus();
&&&&&&&&&&&
void ZHomeNavigator::keyReleaseEvent(QKeyEvent *event)
&&& qDebug()&&&release&;
某个部件具有焦点时,使用QToolButton:focus来进行qss美化工作。
app.setStyleSheet(&QToolButton:focus{background-color:}&);
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(1)(2)(5)(9)(42)(87)(45)(7)(5)(17)(4)(2)(1)(23)(14)5069人阅读
qt中简单的打印过程
1、新建一个qprintviewdialog对象p。
2、connect对象p的 printrequisition 信号到自己的一个函数如doprint(*printer)
3、实现doprint函数,就是在里面使用 qpainter(print)新建一个painter后直接在里面画就好了。
4、p.exec()
这种方式是显示qt提供的打印预览对话框,该对话框需要你提供printrequisition信号的实际实现。当p需要预览或打印时就会发出该信号,你只要实现好doprint函数即可,别的qt都为你做好了。
需要注意的是:
1、在第三步中当调用painter.begin后默认就会创建一个空白页,所以一开始不需要 newpage,直接画就是了;
2、在一页画完以后直接调用print.newpage创建新页面
3、直到所有页面画完后才可以调用 painter.end().
4、qt提供的qprintviewdialog对话框已经包含了所有有关打印设置的功能,如需定制可以在新建p之前调用printdialog对话框来获取打印机,将其传给p的构造函数即可。
5、printer对象的pagerect返回的是去掉页边距后的矩形;paperrect返回的是纸张大小(单位可以设置)
6、这种方式不能适合多种打印机,也就是说你设计好了能工作了可能换到针式打印机就不一样了。因为不同打印机支持的纸张及打印分辨率不同。
解决方法推荐:
建议首先在A4纸张和300或600分辨率下设计,程序中设置一个变量deltaW=程序运行时打印机中的纸张宽度*程序运行时打印机分辨率/(A4纸宽度*300或600),然后在所有表示坐标.x或大小.w的数字上乘以deltaW即可。同样的也可以设置垂直缩放比例。
注意是所有的,包括字体大小、及绘图中的各种坐标。这样不管用什么纸张在什么打印机下都可以完全显示了(打出来会是整体放大或缩小)。如果你能预先知道客户机上的打印环境的话,就不必这一步了。
================================
在Qt中,打印与在 QWidget,QPixmap或者QImage绘图很相似,一般步骤如下:
1、创建绘图设备的QPrinter;
2、弹出打印对话框,QPrintDialog,允许用户选择打印机,设置属性等;
3、创建一个QPrinter的QPainter;
4、用QPainter绘制一页;
5、调用QPrinter::newPage(),然后绘制下一页;
6、重复步骤4,5,直到打印完所有页。
在Windows和Mac OS X平台,QPrinter使用系统的打印驱动程序。在Unix上,QPrinter生成脚本并把脚本发送给lp或者lpr(或者发送给程序,打印程序有函 数QPrinter::setPrintProgram())。调用QPrinter::setOutputFormat (QPrinter::PdfFormat)QPrinter也可以生成PDF文件。
Figure 8.12. Printing a QImage
首先看一个简单的例子,打印一个QImage到一页纸上。
void PrintWindow::printImage(const QImage &image)
&&& QPrintDialog printDialog(&printer, this);
&&& if (printDialog.exec()) {
&&&&&&& QPainter painter(&printer);
&&&&&&& QRect rect = painter.viewport();
&&&&&&& QSize size = image.size();
&&&&&&& size.scale(rect.size(), Qt::KeepAspectRatio);
&&&&&&& painter.setViewport(rect.x(), rect.y(),
&&&&&&&&&&&&&&&&&&&&&&&&&&& size.width(), size.height());
&&&&&&& painter.setWindow(image.rect());
&&&&&&& painter.drawImage(0, 0, image);
这里,我们假设了在PrintWindow类有一个QPrinter类型的成员变量printer。当然在printImage()函数的堆上我们也可以创建一个QPrinter,但是这样不能记录用户进行打印时的设置
创建QPrintDialog,调用exec()显示出来,如果用户点击了OK返回true,否则返回false。调用exec()后,QPrinter 对象就可以使用了。(也可以不显示QPrintDialog,直接调用QPrinter的成员函数进行复制也可以)
然后,我们创建QPainter,绘图设备为QPrinter。设置窗口为所显示图形的矩形,视口也同样比例,然后在(0,0)绘制图像。
通常,QPainter的窗口自动进行了初始化,打印机和屏幕有着一致的分辨率(一英寸有72到100个点),使控件的打印代码能够重用。在上面的函数中,我们自己设置来QPainter的窗口。
在一页中进行打印很简单,但是,很多应用程序需要打印多页。这时我们一次打印一页,然后调用newPage()打印另一页。这里需要解决定一个问题是要确定一页打印多少内容。在Qt中有两种方法处理多页的打印文档:
1、我们可以把数据转换为HTML格式,使用QTextDocument描述他们,QTextDocument是Qt的多文本引擎。
2、手动进行分页
下面我们来分别看一下这两种方法。第一个例子,我们想打印一个花卉的指导:一列为花的名字,另一列为文本描述。每一条的文本格式存储为:“名称:描述”。 例如:Miltonopsis santanae: A most dangerous orchid species.
由于每一种花卉的数据都可以用一个字符串表示,我们可以用QStringList表示所有花卉的数据。下面的代码为使用Qt的多文本引擎进行打印的例子:
void PrintWindow::printFlowerGuide(const QStringList &entries)
&&& foreach (QString entry, entries) {
&&&&&&& QStringList fields = entry.split(&: &);
&&&&&&& QString title = Qt::escape(fields[0]);
&&&&&&& QString body = Qt::escape(fields[1]);
&&&&&&& html += &&table width=/&100%/& border=1 cellspacing=0&/n&
&&&&&&&&&&&&&&& &&tr&&td bgcolor=/&lightgray/&&&font size=/&+1/&&&
&&&&&&&&&&&&&&& &&b&&i&& + title + &&/i&&/b&&/font&/n&tr&&td&& + body
&&&&&&&&&&&&&&& + &/n&/table&/n&br&/n&;
&&& printHtml(html);
首先把QStringList转换为HTML。每一种花卉为HTML表格中的一行,调用Qt::escapte()将特殊字符 ’&’,’&’,’&’等用相应的HTML字符表示(’amp’,’&gt’,’&lt’),然后调用 printHtml()打印文本:
void PrintWindow::printHtml(const QString &html)
&&& QPrintDialog printDialog(&printer, this);
&&& if (printDialog.exec()) {
&&&&&&& QPainter painter(&printer);
&&&&&&& QTextDocument textD
&&&&&&& textDocument.setHtml(html);
&&&&&&& textDocument.print(&printer);
函数printHtml()弹出QPrintDialog对话框,负责打印一个HTML文档。这些代码可以在所有Qt的应用程序中打印任意HTML文档。
Figure 8.13. Printing a flower guide using QTextdocument
目前,把文本转换为HTML文档用QTextDocument打印是最方便的一个方法。如果需要更多的设置,就需要我们自己进行页面布局和绘制。下面的方法就是用人工干预的方式打印花卉指南。首先看一下printFlowerGuide()函数:
void PrintWindow::printFlowerGuide(const QStringList &entries)
&&& QPrintDialog printDialog(&printer, this);
&&& if (printDialog.exec()) {
&&&&&&& QPainter painter(&printer);
&&&&&&& QList&QStringList&
&&&&&&& paginate(&painter, &pages, entries);
&&&&&&& printPages(&painter, pages);
在创建QPainter,设置好打印机以后,调用函数paginate()确定那些项目在那一页。执行这个函数的结果是得到一个QStringList的列表,每一个QStringList在一页里显示,把这个结果传递给printPages()进行打印。
例如:需要打印的花卉指南有6个条目:A,B,C,D,E,F。其中A和B在第一页,C,D,E打印在第二页,F在第三页打印。
void PrintWindow::paginate(QPainter *painter, QList&QStringList& *pages,
&&&&&&&&&&&&&&&&&&&&&&&&&& const QStringList &entries)
&&& QStringList currentP
&&& int pageHeight = painter-&window().height() - 2 * LargeG
&&& int y = 0;
&&& foreach (QString entry, entries) {
&&&&&&& int height = entryHeight(painter, entry);
&&&&&&& if (y + height & pageHeight && !currentPage.empty()) {
&&&&&&&&&&& pages-&append(currentPage);
&&&&&&&&&&& currentPage.clear();
&&&&&&&&&&& y = 0;
&&&&&&& currentPage.append(entry);
&&&&&&& y += height + MediumG
&&& if (!currentPage.empty())
&&&&&&& pages-&append(currentPage);
函数paginate()把花会指南条目分页。根据entryHeight()计算每一个条目的高度。同时考虑页面顶端和底端的垂直距离 LargeGap。
遍历所有的条目,如果这个条目可以放在当前页,就把这个条目放到当前页的列表里面。当前页排满后,把当前页放到页的列表中,开始新的一页。
int PrintWindow::entryHeight(QPainter *painter, const QString &entry)
&&& QStringList fields = entry.split(&: &);
&&& QString title = fields[0];
&&& QString body = fields[1];
&&& int textWidth = painter-&window().width() - 2 * SmallG
&&& int maxHeight = painter-&window().height();
&&& painter-&setFont(titleFont);
&&& QRect titleRect = painter-&boundingRect(0, 0, textWidth, maxHeight,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Qt::TextWordWrap, title);
&&& painter-&setFont(bodyFont);
&&& QRect bodyRect = painter-&boundingRect(0, 0, textWidth, maxHeight,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Qt::TextWordWrap, body);
&&& return titleRect.height() + bodyRect.height() + 4 * SmallG
函数entryHeight()根据QPainter::boundingRect()计算每一个条目的垂直距离,图8.4表明了条目的布局和 SmallGap还MediumGap的含义:
The enTRyHeight() function uses QPainter::boundingRect() to compute the vertical space needed by one entry. Figure 8.14 shows the layout of a flower entry and the meaning of the SmallGap and MediumGap constants.
Figure 8.14. A flower entry's layout
void PrintWindow::printPages(QPainter *painter,
&&&&&&&&&&&&&&&&&&&&&&&&&&&& const QList&QStringList& &pages)
&&& int firstPage = printer.fromPage() - 1;
&&& if (firstPage &= pages.size())
&&& if (firstPage == -1)
&&&&&&& firstPage = 0;
&&& int lastPage = printer.toPage() - 1;
&&& if (lastPage == -1 || lastPage &= pages.size())
&&&&&&& lastPage = pages.size() - 1;
&&& int numPages = lastPage - firstPage + 1;
&&& for (int i = 0; i & printer.numCopies(); ++i) {
&&&&&&& for (int j = 0; j & numP ++j) {
&&&&&&&&&&& if (i != 0 || j != 0)
&&&&&&&&&&&&&&& printer.newPage();
&&&&&&&&&&&
&&&&&&&&&&& if (printer.pageOrder() == QPrinter::FirstPageFirst) {
&&&&&&&&&&&&&&& index = firstPage +
&&&&&&&&&&& } else {
&&&&&&&&&&&&&&& index = lastPage -
&&&&&&&&&&& }
&&&&&&&&&&& printPage(painter, pages[index], index + 1);
函数printPages()的作用是调用printPage()按照顺序和打印份数打印每一页。通过QPrintDialog,用户可能需要打印多份,设置了打印范围,或者要求逆序打印。我们需要在程序中考虑这些需求
首先确定打印范围。QPrinter::fromPage()和toPage()返回用户选择的页面范围。如果没有选择,返回为0。我们进行了减1操作是 因为我们的页面索引是从0开始的。如果用户没有选定范围,则打印全部,firstPage和lastPage包含量所有的页面。
然后我们打印每一页。最外层循环为用户设定的打印的份数。对于那些支持多份打印的打印机,QPrinter::numCopies()总是返回1。如果打 印机驱动程序不支持多份打印,numCopies()返回到是用户指定的打印份数,有应用程序实现多份打印。(在这一节的QImage例子中,为了简单起 见,我们没有考虑多份打印。)
Figure 8.15. Printing a flower guide using QPainter
内层循环遍历打印的页数。如果页数不是第一页,调用newPage()清楚原来的页面开始填充新页面。调用printPage()打印每一页。
void PrintWindow::printPage(QPainter *painter,
&&&&&&&&&&&&&&&&&&&&&&&&&&& const QStringList &entries, int pageNumber)
&&& painter-&save();
&&& painter-&translate(0, LargeGap);
&&& foreach (QString entry, entries) {
&&&&&&& QStringList fields = entry.split(&: &);
&&&&&&& QString title = fields[0];
&&&&&&& QString body = fields[1];
&&&&&&& printBox(painter, title, titleFont, Qt::lightGray);
&&&&&&& printBox(painter, body, bodyFont, Qt::white);
&&&&&&& painter-&translate(0, MediumGap);
&&& painter-&restore();
&&& painter-&setFont(footerFont);
&&& painter-&drawText(painter-&window(),
&&&&&&&&&&&&&&&&&&&&& Qt::AlignHCenter | Qt::AlignBottom,
&&&&&&&&&&&&&&&&&&&&& QString::number(pageNumber));
函数printPage()打印页面中的每一个条目。首先用printBox()打印标题,然后用printBox()打印描述。在每一页的底端打印页码。
Figure 8.16. The flower guide's page layout
void PrintWindow::printBox(QPainter *painter, const QString &str,
&&&&&&&&&&&&&&&&&&&&&&&&&& const QFont &font, const QBrush &brush)
&&& painter-&setFont(font);
&&& int boxWidth = painter-&window().width();
&&& int textWidth = boxWidth - 2 * SmallG
&&& int maxHeight = painter-&window().height();
&&& QRect textRect = painter-&boundingRect(SmallGap, SmallGap,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& textWidth, maxHeight,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Qt::TextWordWrap, str);
&&& int boxHeight = textRect.height() + 2 * SmallG
&&& painter-&setPen(QPen(Qt::black, 2, Qt::SolidLine));
&&& painter-&setBrush(brush);
&&& painter-&drawRect(0, 0, boxWidth, boxHeight);
&&& painter-&drawText(textRect, Qt::TextWordWrap, str);
&&& painter-&translate(0, boxHeight);
printBox()首先绘制一个矩形框,然后在矩形框中绘制文本。
打印预览:
void Widget::on_pushButton_6_clicked()
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog preview(&printer,this);
connect(&preview,SIGNAL(paintRequested(QPrinter*)),this,SLOT(printView(QPrinter*)));
preview.exec();
void Widget::printView(QPrinter *printer)
ui-&textBrowser-&print(printer);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:60928次
排名:千里之外
原创:19篇
转载:30篇
(2)(1)(3)(3)(7)(4)(3)(1)(1)(13)(11)

我要回帖

更多关于 如何按空格分开两列 的文章

 

随机推荐