精华内容
下载资源
问答
  • Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询的数据,其中导出数据到...

    一、前言

    用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询的数据,其中导出数据到Excel最常见,基本上有三种方法。
    方法一使用QAxObject,小数据量还可以,数据量一大直接懵逼,性能指数级下降,而且不支持跨平台,只能在WIN上玩一玩,对于大量的linux开发者来说,直接废了。
    方法二使用第三方开源的QtXlsx,这个做的还是可以,使用人群也比较多,据说不依赖office组件跨平台的,缺点就是不支持xls格式,只支持高版本的xlsx,使用稍微比较繁琐,用户更多的需要的是直接一个函数传入对应的数据即可,越简单越好。
    方法三使用csv格式作为导出数据,纯文本的数据存储格式,默认逗号作为分隔符,也可以指定其他符号作为分隔符,csv格式也是各种表格软件都支持的格式,相当轻便,作为各大系统或者平台和编程语言之间交互数据还是非常方便的,很多工业控制领域的软件都会采用这种格式,缺点就是太简单了,不能分组或者指定过滤条件特殊颜色显示等。
    在对比了三种方式以后,决定自己造个轮子,主要是为了自身项目的需要写的,后面慢慢的客户需求多了,增加了通用常用场景的数据导出需求,目标要求至少包含三点:速度够快、使用够简洁、不依赖任何组件。
    作品大全:https://qtchina.blog.csdn.net/article/details/97565652

    二、功能特点

    1. 原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,尤其是支持嵌入式linux。
    2. 10万行数据9个字段只需要2秒钟完成。
    3. 只需要四个步骤即可开始急速导出大量数据到Excel。
    4. 同时提供直接写入数据接口和多线程写入数据接口,不卡主界面。
    5. 可设置标题、副标题、表名。
    6. 可设置字段名称、列宽度。
    7. 可设置是否启用校验过滤数据、校验的列、校验规则、校验值,符合规则的特殊颜色显示。
    8. 可设置随机背景颜色及需要随机背景色的列集合。
    9. 支持分组输出数据,比如按照设备分组输出数据,方便查看。
    10. 可自定义行内容分隔符。
    11. 可追加数据形式写入数据,建议每次追加的数据小于10000条。
    12. 灵活性超高,可自由更改源码设置对齐方式、文字颜色、背景颜色等。
    13. 支持任意excel表格软件,包括但不限于excel2003/2007/2010/2013/2017/wps/openoffice等。
    14. 除了提供导出到Excel类以外,还提供导出到Pdf文件以及打印数据的类。
    15. 注释完善,详细完整的使用demo,支持QTableWidget、QTableView、数据库三种数据源。
    16. 纯Qt编写,支持任意Qt版本+任意编译器+任意系统。

    三、效果图

    在这里插入图片描述

    四、使用方法

    //第一步:设置文件路径,标题等信息;
    QList<QString> columnNames;
    QList<int> columnWidths;
    columnNames << "防区号" << "防区名称" << "告警类型" << "告警内容" << "告警时间";
    columnWidths << 65 << 100 << 120 << 150 << 180;
    
    QString file = qApp->applicationDirPath() + "/1.xls";
    ExcelThread::Instance()->init();
    ExcelThread::Instance()->setFileName(file);
    ExcelThread::Instance()->setSheetName("告警信息");
    ExcelThread::Instance()->setTitle("所有告警信息");
    ExcelThread::Instance()->setSubTitle(QString("%1 导出告警信息").arg(DATETIME));
    ExcelThread::Instance()->setColumnNames(columnNames);
    ExcelThread::Instance()->setColumnWidths(columnWidths);
    
    //第二步:打开文件,启动线程;
    ExcelThread::Instance()->open();
    ExcelThread::Instance()->start();
    
    //第三步:逐行输入数据;
    QStringList list;
    list << "防区上线" << "防区离线" << "防区旁路" << "防区报警" << "防区故障";
    for (int i = 0; i < logCount; i++) {
        int index = qrand() % 4;
        QStringList temp;
        temp.append(QString::number(i + 1));
        temp.append("防区" + QString::number(i + 1));
        temp.append("主机上报");
        temp.append(list.at(index));
        temp.append(DATETIME);
        ExcelThread::Instance()->appendContent(temp.join(";"));
    }
    
    //第四步:关闭文件,关闭线程;
    ExcelThread::Instance()->close();
    ExcelThread::Instance()->stop();
    
    展开全文
  • QT打印

    千次阅读 2012-10-16 09:00:40
    Qt中,打印与在QWidget,QPixmap或者QImage绘图很相似,一般步骤如下: 1、创建绘图设备的QPrinter; 2、弹出打印对话框,QPrintDialog,允许用户选择打印机,设置属性等; 3、创建一个QPrinter的QPainter; 4...

    在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)
    {
        QString html;
        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 textDocument;
            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> pages;
            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 currentPage;
        int pageHeight = painter->window().height() - 2 * LargeGap;
        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 + MediumGap;
        }
        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 * SmallGap;
        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 * SmallGap;
    }
    函数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())
            return;
        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 < numPages; ++j) {
                if (i != 0 || j != 0)
                    printer.newPage();
                int index;
                if (printer.pageOrder() == QPrinter::FirstPageFirst) {
                    index = firstPage + j;
                } else {

                    index = lastPage - j;
                }
                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 * SmallGap;
        int maxHeight = painter->window().height();
        QRect textRect = painter->boundingRect(SmallGap, SmallGap,
                                               textWidth, maxHeight,
                                               Qt::TextWordWrap, str);
        int boxHeight = textRect.height() + 2 * SmallGap;
        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()首先绘制一个矩形框,然后在矩形框中绘制文本。
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/iamdbl/archive/2007/10/08/1816001.aspx

    展开全文
  • Qt打印详解

    万次阅读 2017-01-25 09:16:06
    Qt中,打印与在QWidget,QPixmap或者QImage绘图很相似,一般步骤如下: 1、创建绘图设备的QPrinter; 2、弹出打印对话框,QPrintDialog,允许用户选择打印机,设置属性等; 3、创建一个QPrinter的QPainter; 4、用...

    QT作为一款轻量级的集成开发环境,其设计的目标是使开发人员利用QT这个应用程序框架更加快速及轻易的开发应用程序。要达到此目的,要求QT必须能够跨平台,QT能够在32位及64位的Linux,MAC OS X以及Windows上运行。

    现在我们想在项目中加入一项打印功能,即使在不同的操作系统环境下,仍然能有相同的用户体验,在实现中发现QT对打印的支持不是那么友好。我们希望在跨平台的情况下,能打印各种文档,比如用户的简历,发现如果不调用对应操作系统的内核外壳打印函数,这项工作变得异常艰难。我们希望用QT自带的函数库,来实现简单的打印功能,这样就实现了一次编码,多环境使用的目的,在Qt中,打印与在QWidget,QPixmap或者QImage绘图很相似,一般步骤如下:

    (1).创建绘图设备的QPrinter;
    (2).弹出打印对话框,QPrintDialog,允许用户选择打印机,设置属性等;
    (3).创建一个QPrinter的QPainter;
    (4).用QPainter绘制一页;
    (5).调用QPrinter::newPage(),然后绘制下一页;

    (6).重复步骤4,5,直到打印完所有页。

    目前操作系统打印支持两种方式:一.调用内核外壳打印函数

    Linux下面相对比较容易,使用lpr –p [printer] [fileName]即可,即如果想把file.cpp文件送到打印机pl则使用lpr –p pl file.cpp即可。

    Windows下,我们实现打印既定文件路径的文档时,我们调用windows内核命令执行函数,实现打印功能。具体代码如下:

    bool printFile(const QString & filePath)
    {
        // create a printer
        QPrinter printer;
        QString printerName = printer.printerName();
        // no default printer or no file return false
        if( printerName.size() == 0 || filePath.size() == 0)
            return false;
        QFileInfo fi(filePath);
        if(!fi.exists())
            return false;
        int ret = 0;
        ret = (int)ShellExecuteW(NULL,
                      QString("print").toStdWString().c_str(),
                      filePath.toStdWString().c_str(),
                      NULL,
                      NULL,
                      SW_HIDE);
        // if return number bigger than 31 indicate succ
        if (ret > SE_ERR_NOASSOC)
            return true;
        return false;
    }
    2.使用QT自定义的类和函数实现打印文件的功能


    QT中和打印文件相关的类如下所示,它们分别是:

    抽象文档打印对话框类,提供配置打印机的打印对话框基本实现;
    页面设置对话框类,和打印页面相关参数的配置对话框;
    打印对话框类,指定打印机配置的对话框;
    打印引擎类,定义了QPrinter类如何与打印子系统交互的接口;
    打印预览对话框类,用来预览和配置页面布局的对话框;
    打印预览控件类,预览页面布局的控件;
    打印机类,指示打印机如何工作。

    QT中实现打印的方法

    在QT中如果想实现打印,首先,我们需要构造一个打印机类(QPrinter)对象, 其次,使用此对象构造一个打印对话框类(QprinterDialog)对象。如下所示:

    QPrinter printer;
    QprinterDialog *dialog = new QprintDialog(&printer, this);
    dialog->setWindowtitle(tr(“Print Document”));
    if(editor->textCursor().hasSelection())
    	dialog->addEnabledOption(QabstractPrintDialog::PrintSelection);
    if (dialog->exec() != QDialog::Accepted)
    	return;

    最后附上在项目中,我们如何利用QT自身类,来实现这个跨平台的打印功能。

    首先,在头文件中指定槽函数:

    private slots:
        void doPrint();
        void doPrintPreview();
        void printPreview(QPrinter *printer);
        void createPdf();
    void setUpPage();
    具体实现如下:
    void MainWindow::doPrint()
    {
        // 创建打印机对象
        QPrinter printer;
        // 创建打印对话框
        QString printerName = printer.printerName();
        if( printerName.size() == 0)
            return;
        QPrintDialog dlg(&printer, this);
        //如果编辑器中有选中区域,则打印选中区域
        if (ui->textEdit->textCursor().hasSelection())
            dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
        // 如果在对话框中按下了打印按钮,则执行打印操作
        if (dlg.exec() == QDialog::Accepted)
        {
           ui->textEdit->print(&printer);
           // print the existing document by absoult path
          //  printFile("D:/myRSM.doc");
        }
    }
    // 打印预览
    void MainWindow::doPrintPreview()
    {
        QPrinter printer;
        // 创建打印预览对话框
        QPrintPreviewDialog preview(&printer, this);
        // 当要生成预览页面时,发射paintRequested()信号
        connect(&preview, SIGNAL(paintRequested(QPrinter*)),
                      this,SLOT(printPreview(QPrinter*)));
        preview.exec();
    }
    void MainWindow::printPreview(QPrinter *printer)
    {
        ui->textEdit->print(printer);
    }
    // 生成PDF文件
    void MainWindow::createPdf()
    {
        QString fileName = QFileDialog::getSaveFileName(this, tr("导出PDF文件"), QString(), "*.pdf");
        if (!fileName.isEmpty()) {
            // 如果文件后缀为空,则默认使用.pdf
            if (QFileInfo(fileName).suffix().isEmpty())
                fileName.append(".pdf");
            QPrinter printer;
            // 指定输出格式为pdf
            printer.setOutputFormat(QPrinter::PdfFormat);
            printer.setOutputFileName(fileName);
            ui->textEdit->print(&printer);
        }
    }
    // 页面设置
    void MainWindow::setUpPage()
    {
        QPrinter printer;
        QPageSetupDialog pageSetUpdlg(&printer, this);
        if (pageSetUpdlg.exec() == QDialog::Accepted)
        {
            printer.setOrientation(QPrinter::Landscape);
    }
    else
    {
    	printer.setOrientation(QPrinter::Portrait);
    }
    }


           在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)
    {
        QString html;
        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 textDocument;
            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> pages;
            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 currentPage;
        int pageHeight = painter->window().height() - 2 * LargeGap;
        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 + MediumGap;
        }
        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 * SmallGap;
        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 * SmallGap;
    }
    函数entryHeight()根据QPainter::boundingRect()计算每一个条目的垂直距离,图8.4表明了条目的布局和SmallGap还MediumGap的含义:
    The enTRyHeight() function uses QPainter::boundingRect() to compute the vertical space needed by on e 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())
            return;
        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 < numPages; ++j) {
                if (i != 0 || j != 0)
                    printer.newPage();
                int index;
                if (printer.pageOrder() == QPrinter::FirstPageFirst) {
                    index = firstPage + j;
                } else {
    
                    index = lastPage - j;
                }
                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 * SmallGap;
        int maxHeight = painter->window().height();
        QRect textRect = painter->boundingRect(SmallGap, SmallGap,
                                               textWidth, maxHeight,
                                               Qt::TextWordWrap, str);
        int boxHeight = textRect.height() + 2 * SmallGap;
        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()首先绘制一个矩形框,然后在矩形框中绘制文本。

    展开全文
  • Qt打印

    千次阅读 2015-01-19 21:03:19
    1、普通打印图片,例如 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); image.load("flower.jpg");//导入图片 } void MainWindow::...

    1、普通打印图片,例如

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        image.load("flower.jpg");//导入图片
    
    }

    void MainWindow::printImage()
    {
        QPrinter printer(QPrinter::HighResolution);
        QPrintDialog printDialog(&printer,this);
        if(printDialog.exec())
        {
            QPainter painter(&printer);
            QRect rect=painter.viewport();
            QSize size=image.size();
            size.scale(rect.size(),Qt::KeepAspectRatio);//保证图片显示完整,当源区域和目标区域大小不同时,源区域将会按指定的内容缩放以符合目标区域,缩放比例取决于Qt::AspectRatioMode
            painter.setViewport(rect.x(),rect.y(),size.width(),size.height());
            painter.setWindow(image.rect());
            painter.drawImage(0,0,image);//绘制图片
        }
    }
    2、抓取窗口并打印,例如

    PrintImage::PrintImage(QWidget *parent, Qt::WFlags flags)
        : QMainWindow(parent, flags)
    {
        labImage = new QLabel(this);
        labImage->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
        labImage->setScaledContents(true);
        setCentralWidget(labImage);
        if(image.load("background.png"))
        {
            labImage->setPixmap(QPixmap::fromImage(image));//窗口显示图片
            resize(image.width(),image.height());
        }
    }

    void PrintImage::print()
    {
        QPrinter printer;
        QPrintDialog printDlg(&printer,this);
        if(printDlg.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.drawPixmap(0,0,QPixmap::grabWidget(this,this->rect()));//抓取窗口
    
        }
    }
    3、打印前预览,例如

    void Widget::preView()
    {
        QPrinter printer(QPrinter::HighResolution);
        QPrintPreviewDialog preview(&printer,0);
        connect(&preview, SIGNAL(paintRequested(QPrinter *)),this,SLOT(print(QPrinter *)));//<span style="font-family: Arial, Helvetica, sans-serif;">print(QPrinter *)函数自己实现</span>
        preview.exec();//等待预览界面退出,预览界面含有打印功能
    }

    4、打印特殊窗口部件,例如Graphics View框架

    Graphics View框架通过场景的QGraphicsScene::render()函数和视图的QGraphicsView::render()函数均可以完成打印。这两个函数的差别在于坐标不同。GraphicsScene::render()函数通常用来绘制没有变换的场景,如几何函数、文本文档。QGraphicsView::render()函数用来实现屏幕快照,它默认的行为是将视口的数据绘制到指定的绘图设备。

    void MainWindow::print()
    {
        QPrinter printer;
        if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
            QPainter painter(&printer);
            painter.setRenderHint(QPainter::Antialiasing);
            view->render(&painter);//打印视图
            //scene->render(&painter);//打印场景
        }
    }
    其他典型窗口部件的打印函数

    QSvgWidget----------------------QSvgRenderer::render()

    QTextEdit     ----------------------QTextDocument::print()

    QTextLayout----------------------QTextLayout::draw()

    QTextLine    ----------------------QTextLine::draw()

    5、打印文本,例如

    void MainWindow::print(const QString &strHtml,const QString &strPdfFile, int iFormat = 1)
    {
        // strHtml是HTML格式的打印内容,strPdfFile是PDF文件路径
        QString strPdfFile("./document1.pdf");//最终pdf上显示的可能是乱码
        QPrinter printer;
        QTextDocument doc;
        doc.setHtml(strHtml);
    
        if (iFormat == 1)
        {
            printer.setPageSize(QPrinter::A4);
            printer.setOutputFormat(QPrinter::PdfFormat);
            printer.setOutputFileName(strPdfFile);
            doc.print(&printer);
        }
        else
        {
            doc.setPageSize(QSizeF(printer.logicalDpiX()*(80/25.4),printer.logicalDpiY()*(297/25.4)));
            printer.setOutputFormat(QPrinter::NativeFormat);
            doc.print(&printer);
        }
    }
    6、打印表格,例如(此处参考了http://blog.csdn.net/prochsh/article/details/5529944)
    void QCurveQueryTool::printTable(QPrinter *printer)
    {
        QString title = QString("曲线打印");
        printTableWidget(table,title,printer);
    }
    
    void QCurveQueryTool::printTableWidget(const QTableWidget* view,QString stitile,QPrinter *printer) //printFlag =1,打印表格
    {
        double totalWidth = 0.0;
        double totalHeight = 0.0;
        double totalPageHeight=0.0;
        
        int rows = view->model()->rowCount();   //行总数
        const int cols = view->model()->columnCount(); //列总数
        
        for (int c = 0; c < cols; ++c)  //求出列宽
        {
            totalWidth += view->columnWidth(c);
        }
        
        for (int r = 0; r < rows; ++r) //求出行宽
        {
            totalHeight += view->rowHeight(r);
        }
        
        QPainter painter(printer);
        painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
        painter.begin(printer);
        QRect area = printer->paperRect();// paperRect();
        QVector<int> startRow;
        QVector<int> endRow;
        int iCount = 0;
        qreal left,top,right,bottom;
        printer->getPageMargins(&left,&top,&right,&bottom,QPrinter::Point);
        cout << "left = " << left << ", right = " << right << ", top = " << top << ", bottom = " << bottom << endl;
        area.setHeight( int(area.height() - top - bottom) );
        area.setWidth( int(area.width() - left - right) );
        
        for (int p=0; p < rows; p++) //rows中保存了所有的行数 , 找出每次打印的开始行和结束行
        {
            totalPageHeight += view->rowHeight(p); //求出所有的列高度
            int pageFooter = 50 ;  //页脚的高度
            int pageHeader = 50;   //页眉的高度
            if (startRow.size() == 0)
            {
                pageFooter = 50 ;
                pageHeader = 500;
            }
            if ((totalPageHeight >= (area.height() - pageFooter - pageHeader)) || (p == rows -1))  //如果目前累加列的高度大于或者等于可用页面高度 || 到达最后一行
            {
                totalPageHeight = view->rowHeight(p);
                if (p == rows -1)
                {
                    if (p - iCount - 2 < 0)
                    {
                        startRow.push_back(0);
                    }
                    else
                    {
                        startRow.push_back(p - iCount - 2);
                    }
                    endRow.push_back(p);
                    //cout << startRow.at(startRow.size() - 1) << " " << endRow.at(endRow.size() - 1) << endl;
                }
                else
                {
                    if (p - iCount - 2 < 0)
                    {
                        startRow.push_back(0);
                        endRow.push_back(p - 2);
                    }
                    else
                    {
                        startRow.push_back(p - iCount - 1);
                        endRow.push_back(p - 3);
                    }
                    //cout << startRow.at(startRow.size() - 1) << " " << endRow.at(endRow.size() - 1) << endl;
                }
                iCount = 0;
            }
            iCount++;
        }
        
        QTableWidget *printTable = new QTableWidget();
        //printTable->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
        //printTable->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
        //printTable->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
        //printTable->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
        const double xscale = area.width() / totalWidth;
        const double yscale = area.height() / totalHeight;
        //const double pscale = area.height() / totalPageHeight;
        //painter.scale(xscale , yscale); // With the scaling 3 It is Printing all
        //painter.translate(area.x() + xscale, area.y() + pscale); //This is original
        painter.translate(area.x() + xscale, area.y() + yscale);
        //painter.save(); //commented
        //int y=0 ;// This is introduced for the columns
        //view->paintEvent(&event);
        //QPainter paint(this);
        //paint.setPen(Qt::red);
        //paint.drawRect(0, 0, 0, 0);
        QStyleOptionViewItem option;  
        QPen pen;
        pen.setColor(Qt::black);
        pen.setWidth(1);
        painter.setPen(pen);
        
        int irowcount = -1;
        float rate = 1;
        for(int ipage = 0; ipage < startRow.size();ipage++)  //startRow有大,就有多少页需要打印
        {
            printTable->setColumnCount(view->columnCount() + 1);  //打印的列数为view的列数
            printTable->setRowCount(endRow[ipage] - startRow[ipage] + 2);  //设置当前打印页的行数
            for(int c = 1;c < cols + 1;c++)
            {
                printTable->setColumnWidth( c,(view->columnWidth(c - 1)) );
                QTableWidgetItem *newItem = printTable->item(0,c);
                if (!newItem)  //如果printTable的首行不存在,添加文字或者序号
                {
                    if (view->horizontalHeaderItem(c - 1)) //Returns the horizontal(水平的) header item for column
                        newItem = new QTableWidgetItem(view->horizontalHeaderItem(c - 1)->text());
                    else
                        newItem = new QTableWidgetItem(QString::number(c));
                    printTable->setItem(0,c ,newItem);
                }
                else    //否则,直接设置文字或者序号
                {
                    if (view->horizontalHeaderItem(c - 1))
                        newItem->setText(view->horizontalHeaderItem(c - 1)->text());
                    else
                        newItem->setText(QString::number(c));
                }
            }
            
            /求出合适的比率,用来完美表格的显示
            QRect firstTable , lastTable;
            QModelIndex firstIndex = printTable->model()->index(0,0);
            QModelIndex lastIndex = printTable->model()->index(0,cols);
            firstTable = printTable->visualRect(firstIndex);
            lastTable =  printTable->visualRect(lastIndex);
            float totalTableWidth = lastTable.topRight().x() - firstTable.topLeft().x();
            float pagerWidth = printer->paperRect().width() - 20 - 20;
            rate = totalTableWidth/pagerWidth;
            cout << "totalTableWidth = " << totalTableWidth << ", pagerWidth = " << pagerWidth << ", rate = " << rate << endl;
            /求出合适的比率,用来完美表格的显示
            
            for(int c = 1;c < cols + 1;c++)  //重设宽度
            {
                printTable->setColumnWidth( c,int((view->columnWidth(c - 1))/rate) );
            }
            printTable->setColumnWidth(0,view->verticalHeader()->width());  //Returns the table view's vertical header.
            int iRow = 0;
            for(int ir = startRow[ipage]; ir <= endRow[ipage];ir++) //ir变量用来标识当前打印的是哪些行,设置当前打印页的首行
            {
                printTable->setRowHeight(iRow,view->rowHeight(ir));  //Sets the height of the given row to be height.
                for(int ic = 0; ic < view->columnCount(); ic++)  //设置每个单元格的内容
                {
                    QTableWidgetItem *newItem = printTable->item(iRow  + 1,ic + 1);
                    if (!newItem)
                    {
                        if (view->item(ir,ic))
                            newItem = new QTableWidgetItem(view->item(ir,ic)->text());
                        else
                            newItem = new QTableWidgetItem("");
                        printTable->setItem(iRow + 1,ic + 1,newItem);
                    }
                    else
                    {
                        if (view->item(ir,ic))
                            newItem->setText(view->item(ir,ic)->text());
                        else
                            newItem->setText("");
                    }
                }
                iRow++;
            }
            qreal ioffx = (area.width() - totalWidth)/2;
            qreal ioffy = 50;
            if (ipage == 0)
            {
                ioffy = 500;
                QwtPlotPrintFilter filter;
                int options = QwtPlotPrintFilter::PrintAll;
                options &= ~QwtPlotPrintFilter::PrintBackground;
                options |= QwtPlotPrintFilter::PrintFrameWithScales;
                filter.setOptions(options);
                d_plot->print(&painter,QRect(50,65,650,400),filter);
                
            }
            rows = printTable->rowCount();
            iRow = 1;
            for(int ir = startRow[ipage] ; ir <= endRow[ipage] ; ir++)  //ir变量用来标识当前打印的是哪些行,设置当前打印页的首列序号
            {
                QTableWidgetItem *newItem = printTable->item(iRow,0);
                if (!newItem)
                {
                    if (view->verticalHeaderItem(ir))
                        newItem = new QTableWidgetItem(view->verticalHeaderItem(ir)->text());
                    else
                        newItem = new QTableWidgetItem(QString::number(iRow));
                    printTable->setItem(iRow,0,newItem);
                }
                else
                {
                    if (view->verticalHeaderItem(ir))
                        newItem->setText(view->verticalHeaderItem(ir)->text());
                    else
                        newItem->setText(QString::number(iRow));
                }
                iRow ++;
            }
            
            QPointF offPt(20,ioffy);  //20表示边框的空格
            for (int r = 0; r < rows; r++)
            {
                QRect rt1,rt2;
                QModelIndex idx1 = printTable->model()->index(r,0);
                QModelIndex idx2 = printTable->model()->index(r,cols);
                rt1 = printTable->visualRect(idx1);
                rt2 = printTable->visualRect(idx2);
                painter.drawLine( (rt1.bottomLeft() + offPt) , (rt2.bottomRight() + offPt) );
                if (r == 0)
                {
                    painter.drawLine( (rt1.topLeft() + offPt) , (rt2.topRight() + offPt) );
                }
            }
            for (int c = 0; c < cols + 1; c++)
            {
                QRect rt1,rt2;
                QModelIndex idx1 = printTable->model()->index(0,c);
                QModelIndex idx2 = printTable->model()->index(rows - 1,c);
                rt1 = printTable->visualRect(idx1);
                rt2 = printTable->visualRect(idx2);
                painter.drawLine( (rt1.topLeft() + offPt) , (rt2.bottomLeft() + offPt) );
                if (c == cols)
                {
                    painter.drawLine( (rt1.topRight() + offPt) , (rt2.bottomRight() + offPt) );
                }
            }
            for (int r = 0; r < rows; r++)
            {
                irowcount ++;
                for(int c = 0; c < cols  + 1; c++)
                {
                    QModelIndex idx = printTable->model()->index(r,c);
                    option.rect = printTable->visualRect(idx);
                    if (printTable->item(r,c))
                    {
                        QRectF rt(option.rect.left() + 3,option.rect.top(),option.rect.width(),option.rect.height());
                        rt = rt.translated(offPt);
                        if (r != 0 && c == 0)
                        {
                            painter.drawText(rt,Qt::AlignCenter,QString("%1").arg(irowcount));
                        }
                        else
                        {
                            if (r == 0)
                            {
                                painter.drawText(rt,Qt::AlignCenter,printTable->item(r,c)->text());
                            }
                            else
                            {
                                painter.drawText(rt,Qt::AlignVCenter,printTable->item(r,c)->text());
                            }
                        }
                    }
                }
            }
            //ipage
            if (ipage == 0)  //设置标题
            {
                QRectF rttt(area.left(),area.top(),area.width(),50);
                painter.drawText(rttt,Qt::AlignCenter,stitile);
            }
            QRectF rttt(area.left(),area.bottom() - 65,area.width(),25);
            painter.drawText(rttt,Qt::AlignCenter,QString::number(ipage + 1));
            if (ipage < startRow.size() - 1)
            {
                printer->newPage();
                irowcount--;
            }
        }
        painter.end();
        
    }

    展开全文
  • Qt程序怎么在终端控制台打印数据?今天开发一个小Qt程序,不需要界面,需求只有一个,就是将Qt程序计算出来的结果显示在终端上。应该怎么做呢?下面讲一个方法,希望能帮助到遇到同样需求的朋友。 开发环境: ...
  • Qt 打印时间 毫秒级

    千次阅读 2017-11-03 23:15:42
    Qt 打印时间 毫秒级
  • Qt中(HTML)实现数据表格打印功能 输出 主界面 打印结果 代码 qprintermanager.h #ifndef QPRINTERMANAGER_H #define QPRINTERMANAGER_H #include <QObject> #include <QAbstractItemModel> #...
  • Qt打印信息默认处理程序将消息打印到X11下的标准输出或Windows下的调试器,其实我们可以自己处理相关打印信息,可以选择保存下来、或者界面显示,网络传输等等,qInstallMessageHandler(QtMessageHandler handler)...
  • Qt 打印图片

    千次阅读 2016-01-13 17:42:05
    QPrinter printer; printer.setPageSize(QPrinter::A4); QPainter painter(&printer); pixmap= new QPixmap(); pixmap= cprint->getpixmaplast(); QMatrix matrix;.../* 数据显示至预览界面 */ }
  • qt 打印 Qstring

    千次阅读 2013-03-28 10:46:28
    Qt提供qPrintable()宏来执行和toAscii().constData()一样的功能: QString str = "polluter pays principle";  printf("User: %s\n", qPrintable(str)); QString str = "polluter pays principle";
  • QT UDP 发送数据

    2018-02-05 18:15:09
    QT UDP Server发送数据 主机Port 可以利用spinbnox进行设定, 发送任意字符给UDP Client.
  • QT 打印的简单实现

    万次阅读 2011-08-20 23:23:38
    作为第一次使用QT打印功能我确实被吓到了,在别人鼓吹QPainter强大的时候我不得不考虑工程里大量的图表及曲线图现在都需要一条一条线来画,我似乎看到了我被老板炒鱿鱼并踢出办公室的情景。  图表费点劲还可以用...
  • Qt基本数据类型及函数使用 QT基本数据类型定义在#include 中 QT基本数据类型有: QT C++ 解释 qint8 signed char 有符号8比...
  • qt打印输出到控制台

    2019-10-01 22:56:58
    创建工程的时候是QT Console Application 1.项目->run->Run in terminal 2.pro文件中添加CONFIG +=console thread CONFIG +=console(这种没有验证) 转载于:...
  • qt实现小票打印

    千次阅读 2015-07-05 08:08:39
    通过将数据转化为html后调用qt进行打印,打印机无法打印img标签中的条码2.通过将数据转化为html,将条码直接绘制的方法实现了需求3.代码Barcode.h// Barcode.h: interface for the CBarcode clas
  • Qt实现打印输出功能

    热门讨论 2012-05-22 18:52:43
    Qt中实现打印暑促功能,打印文字图片等,还可以把内容输出为pdf,实现类似QQ的屏幕截图功能
  • 今天遇到一个情况,用QNetworkAccessManager获取HTTP数据时发现当数据量太大时(拷贝出来看大概30多KB左右),获取的数据无法一次性打印出来,转成json格式也无法打印出来,还以为没有获取到数据,困扰了一天。...
  • QT 保存数据到TXT文件上

    千次阅读 2019-11-11 11:04:21
    QT保存数据成TXT文件 //保存为TXT文件 bool exist; QString fileName; QDir *folder = new QDir; exist = folder->exists("C:/Users/no2/Desktop");//查看目录是否存在(例子是保存到桌面) if...
  • 树莓派使用QT串口数据输出

    千次阅读 2018-03-04 18:41:59
    树莓派使用QT串口数据输出首先在.pro 文件中添加如下代码:# 下面这个LIBS很关键 LIBS += -lwiringPimainwindow.cpp#include "mainwindow.h" #include "ui_mainwindow.h" #include &lt;...
  • QT发送数据之udp发送文件 为了处理丢包等原因,发送端每发送一帧接收端都要回复,最后要判断文件接收是否完整。 发送文件 1.浏览选择文件 filepath.clear();//初始化文件路径 fdialog = new QFileDialog();//这里...
  • Qt小票打印之网口程序
  • qt 打印 doc文件

    千次阅读 2013-05-30 15:37:01
     //添加菜单中的选项,这里只加了一个,即打印文件 fileMenu->addAction(printAct); } 添加工具栏: void MainWindow::createToolBar() {  //创建一个file工具栏 toolBar=addToolBar("&...
  • Qt打印功能

    万次阅读 多人点赞 2019-07-25 16:49:52
    Qt做多了没有人逃得过打印模板这个功能,有的话只是时候未到,注释都在代码里了,直接上代码了 1、获取打印机的名称 if(index == 1) { QPrinterInfo info; QStringList list = info.availablePrinterNames(); ...
  • QT打印选择方面不太多,LimeReport 是一个不错的选择。下载之后直接可用。
  • 我用qt做后台数据收发与处理,数据比较多,有什么方法可以把所有数据打包传递给qml
  • QT中QPrinter打印功能

    千次阅读 2019-04-01 16:21:43
    描述:QT程序运行在Linux、Windows平台,软件运行过程中可根据用户的需要生成一系列的报表,现在需要将这些数据自动布局成报表的格式,并实现一键打印功能,如下:点击打印报表即可跳转到打印预览界面,并将当前界面...
  • 你还在到处这样打印结构体么? qDebug()<<"Mc info:"<<info.m_id<<info.r_id<<info.display_type<<info.topic<<info.name<<info.sname; 我刚才还在这样打印结构体,不过...
  • Qt 使用qDebug() 打印Qlist 容器数据

    千次阅读 2017-10-24 12:55:14
    当QList容器中的数据用qDebug() 有这样一个 LogLat 类 定义如下 class LogLat { //需要将 friend QDebug& operatorQDebug &debug, const LogLat &obj); public: LogLat(double log=0.0, double lat=0.0)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,265
精华内容 5,706
关键字:

qt打印数据