• 20766阅读
  • 5回复

有关线程和打印的一个问题 [复制链接]

上一主题 下一主题
离线shifan
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-22
///////////////.h
#ifndef PRINTMANAGER_H
#define PRINTMANAGER_H

#include <QThread>

class QPainter;
class QPrinter;
class QTableWidget;
class QLabel;
class printManager : public QThread
{
    Q_OBJECT
public:
    printManager(QWidget *contentp);
    void run();
private:
    void printTable9(QTableWidget *);
    void printTable5(QTableWidget *);
    void printPicture(QLabel *);
signals:
    void printStarted(QString printSignal="printStarted");
    void printFinished(QString printSignal="printFinished");
    void printProgress(int percent);
private:
    QWidget *content;
    QPainter *painter;
    QPrinter *printer;
};

#endif // PRINTMANAGER_H
////////////.cpp
#include "printManager.h"
#include<QTableWidget>
#include<QLabel>
#include<QTableWidget>
#include<QLabel>
#include<QDateTime>
#include<QPrinter>
#include<QPainter>
#include<QtDebug>

#define DATEWIDTH  60
#define TYPEWIDTH  90
#define FIELDWIDTH 150
#define SPECIALWIDTH 230
#define INCOMEWIDTH  270
#define OUTPUTWIDTH  340
#define TOTALWIDTH   400
#define HANDMANWIDTH 460
#define FIVEONE     60
#define FIVETWO     120
#define FIVETHREE   180
#define FIVEFOUR    240
#define ONEPAGE 43
#define PAGEMARGINWIDTH 20
#define PAGEMARGINHEIGHT 20
#define ROWHEIGHT   20


printManager::printManager(QWidget * contentp)
        :content(contentp)
{
    printer=new QPrinter();
    printer->setOutputFileName("output_file/"+QDateTime::currentDateTime().toString());
    printer->setOutputFormat(QPrinter::PdfFormat);

    painter=new QPainter(printer);
}
void printManager::printTable9(QTableWidget *table)
{  
    int rowCount,fullCircuit,i;
    rowCount=table->rowCount();
    fullCircuit=0;
    for(i=0;i<rowCount;i++)
    {
        painter->drawText(PAGEMARGINWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,table->item(i,0)->text());
        painter->drawText(PAGEMARGINWIDTH+DATEWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,1)->text());
        painter->drawText(PAGEMARGINWIDTH+TYPEWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,2)->text());
        painter->drawText(PAGEMARGINWIDTH+FIELDWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,3)->text());
        painter->drawText(PAGEMARGINWIDTH+SPECIALWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,4)->text());
        painter->drawText(PAGEMARGINWIDTH+INCOMEWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,5)->text());
        painter->drawText(PAGEMARGINWIDTH+OUTPUTWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,6)->text());
        painter->drawText(PAGEMARGINWIDTH+TOTALWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,7)->text());
        painter->drawText(PAGEMARGINWIDTH+HANDMANWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,8)->text());
        ++fullCircuit;
        if(fullCircuit==ONEPAGE&&i!=(rowCount-1))
        {
            fullCircuit=0;
            printer->newPage();
        }
        emit printProgress(((double)(i+1))/((double)rowCount));
    }
}
void printManager::printTable5(QTableWidget *table)
{
    int rowCount,fullCircuit,i;
    rowCount=table->rowCount();
    fullCircuit=0;
    for(i=0;i<rowCount;i++)
    {
        qDebug()<<"draw"<<i<<printer->outputFormat()<<endl;
        painter->drawText(PAGEMARGINWIDTH,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,table->item(i,0)->text());
        painter->drawText(PAGEMARGINWIDTH+FIVEONE,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,1)->text());
        painter->drawText(PAGEMARGINWIDTH+FIVETWO,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,2)->text());
        painter->drawText(PAGEMARGINWIDTH+FIVETHREE,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,3)->text());
        painter->drawText(PAGEMARGINWIDTH+FIVEFOUR,PAGEMARGINHEIGHT+fullCircuit*ROWHEIGHT,"|"+table->item(i,4)->text());
        ++fullCircuit;
        if(fullCircuit==ONEPAGE&&i!=(rowCount-1))
        {
            fullCircuit=0;
            printer->newPage();
        }
        emit printProgress(((double)(i+1))/((double)rowCount));
    }
}
void printManager::printPicture(QLabel *)
{

}
void printManager::run()
{
     this->start();
     emit printProgress(0);
     emit printStarted();
    if(dynamic_cast<QTableWidget *>(content))
    {
        qDebug()<<"print object is a tabal"<<endl;
        QTableWidget *tablePointer=dynamic_cast<QTableWidget *>(content);
        if(tablePointer->columnCount()==9)
            printTable9(tablePointer);
        else printTable5(tablePointer);
    }
    else if(dynamic_cast<QLabel *>(content))
    {
        qDebug()<<"printobject is a picture"<<endl;
        QLabel *labelPointer=dynamic_cast<QLabel *>(content);
        printPicture(labelPointer);
    }
    else
    {
        qDebug()<<"Not a valid print task"<<endl;
    }
    emit printProgress(100);
}
在程序中通过run执行了printTable5.
通过终端的显示可知printTable5中的drawText确实执行了足够多次。
但是打印出的文档却是一个空的文本文件,不知道是为什么?我明
明设置了文件格式为pdf啊!求大侠指点一二。
离线shifan
只看该作者 1楼 发表于: 2009-12-22
高人指点一下我应该在哪些方面进行排错努力也行。。。
离线shifan
只看该作者 2楼 发表于: 2009-12-22
在QThread中就算把所有的操作都弄到一个函数中也无济于事,但是之前我没有开一个线程的时候(即程序是单线程的时候),同样的代码是可以打印成pdf的。
离线shifan
只看该作者 3楼 发表于: 2009-12-23
最后一次顶上来,求帮助。。。
离线shifan
只看该作者 4楼 发表于: 2009-12-23
自己结贴:
从文档Printing with Qt中找到这样一句话,Since the QPrinter starts with a blank page, we only need to call the newPage() function after drawing each page, except for the last page.
The document is sent to the printer, or written to a local file, when we call end().
我就是忘了写end();
离线yb824
只看该作者 5楼 发表于: 2009-12-23
看来还得看帮助啊~~
快速回复
限100 字节
 
上一个 下一个