qt 打印 doc文件

将QString转换成char *:
QByteArray byte1 = openFileName.toLatin1();
char *param1 = byte1.data();
其中openFileName是QString的字符串;
添加菜单:
void MainWindow::createMenus()
{
    //新建一个菜单项,并添加file菜单
fileMenu=menuBar()->addMenu("&File");
    //添加菜单中的选项,这里只加了一个,即打印文件
fileMenu->addAction(printAct);
}
添加工具栏:
void MainWindow::createToolBar()
{
    //创建一个file工具栏
toolBar=addToolBar("&File");
    //添加工具栏中的选项,这里只加了打印文件这一个选项
toolBar->addAction(printAct);
}
//设置菜单和工具栏中的选项
void MainWindow::createActions()
{
    //新建选项并设置快捷键和图标,加上相关曹函数
printAct=new QAction("&Print",this);
printAct->setShortcut(tr("Ctrl+P"));
printAct->setStatusTip("Print the file");
printAct->setIcon(QIcon("/ata0a/c3iword/images/print.png"));
connect(printAct,SIGNAL(triggered()),this,SLOT(printFile()));
void MainWindow::printFile()
{
tops->setFileName(filename);
tops->openDocFileToPrint();
tops->printFile();
}
setFileName(filename);filename赋值给全局变量openFileName;
openDocFileToPrint();是将html文件转换成ps文件;
最后将ps文件写到打印机设备上,即我们的printFile();

doc文件的转换


void QDocToPs::openDocFileToPrint() { char *re = doc_trans(param1,param2,param3);//将word文件转换成html文件,在前一篇文章中有讲述

/*QString QString::fromLocal8Bit ( const char * local8Bit, int len = -1 ) 返回从local8Bit的前len个字符解码得到的Unicode字符串,忽略local8Bit的其余字符。如果len为-1,那么local8Bit的长度将被使用。 如果len大于chars的长度,那么local8Bit的长度将被使用。使用fromLocal8Bit()函数,实现了从本地字符集GB到Unicode的转换,主要应用于处理汉语显示乱码等问题 */

QString reFile = QString::fromLocal8Bit(re);//字符转换 // reading from file FILE * qf = fopen( re, "rb" );

    //求出html文件的大小 int datasize = 0; fseek( qf, 0, SEEK_END ); datasize = ftell( qf );

//读取数据到buffer中 char * buff = ( char * )malloc( datasize ); rewind( qf ); fread( buff, datasize, 1, qf ); 

    //将数据转换格式并写到webView中

QByteArray data( buff );

//通过检查的BOM(字节顺序标记)和内容类型的元头,并能够解码成unicode的html返回QTextCodec实例.Qt 使用 Unicode 存储, 操作字符串. 提供了一套QTextCodec类

去帮助转换非-Unicode格式到Unicode.

QTextCodec *codec = Qt::codecForHtml(data); QString str = codec->toUnicode(data); if (Qt::mightBeRichText(str))

         {/*如果你有现成的HTML文件,则可以直接调用setHtml()方法来加载。*/ webView->setHtml(str); } else { str = QString::fromLocal8Bit(data); /*setPlainText()顾名思义,是设置纯文本的。而setText()参数除了可以设置为纯文本之外,还可以设置为一些 简单的html格式的字符串,当然这些字符串是修饰一个字符串的。*/ webView->setPlainText(str); } //trans file to ps for printer char psfile[100] = {0};     //设置printer格式,文件名等 memcpy(psfile, param1, strlen(param1)-4);//openfile must use .doc extern name. QString fileName = psfile; if(!fileName.isEmpty()) { /*QString QFileInfo::suffix () const

返回文件后缀名。且是构成文件名的最后一个'.'后的后缀符。 例如:         QFileInfo fi("/tmp/archive.tar.gz");          QString ext = fi.suffix(); // ext = "gz"*/ if(QFileInfo(fileName).suffix().isEmpty()) { fileName.append(".ps"); } QPrinter printer(QPrinter::HighResolution); printer.setOutputFormat(QPrinter::PostScriptFormat); printer.setPaperSize(printPageSize);         printer.setOutputFileName(fileName);
                //将html文件转换成ps文件
                webView->print(&printer);
	}
	printPsFile = fileName;

}

 
由此可见,前面只是用来初始化的,真正的转换工作是在print函数中。
我们最后分析print函数,先来看下printFile函数:
int QDocToPs::printFile()
{
char  * fileName;
int printFd;
    //转换文件名
QByteArray byte1 = printPsFile.toLatin1();
fileName = byte1.data();
    //发送到usbprn设备
printFd = open ("/usbprn", 2, 0);
write (printFd,fileName,0) ;
return (OK);
}

print函数

最后看下print函数:
void QTextEdit::print(QPrinter *printer) const
{
    Q_D(const QTextEdit);
    d->control->print(printer);
}
Q_D就是申明一个d的私有类:
//const QTextEditPrivate *const d= d_func();
#define Q_D(Class) Class##Private * const d = d_func()
最后d->control->print(printer)就是调用的QTextEditPrivate->control->print()函数,如下:
void QTextControl::print(QPrinter *printer) const
{
    Q_D(const QTextControl);
    QTextDocument *tempDoc = 0;
    const QTextDocument *doc = d->doc;
    if (printer->printRange() == QPrinter::Selection) {//????????????????????
 //判断当前是否选中了文本
        if (!d->cursor.hasSelection())
            return;
        tempDoc = new QTextDocument(const_cast(doc));   
/*Sets the document's meta information of the type specified by info to the given string.*/
/*通过给定的字符串设置文档的元信息*/
/*允许程序在运行时获得类的相关信息,也就是meta-information.什么是meta-information呢?举例来说,
像这个类叫什么名字?它有什么属性?有什么方法?它的信号列表?它的槽列表?等等这
些信息,就是这个类的meta-information,也就是"元信息".*/
        tempDoc->setMetaInformation(QTextDocument::DocumentTitle, doc->metaInformation(QTextDocument::DocumentTitle));
/*设置打印纸张大小*/
        tempDoc->setPageSize(doc->pageSize());
/*设置默认字体*/
        tempDoc->setDefaultFont(doc->defaultFont());
        tempDoc->setUseDesignMetrics(doc->useDesignMetrics());
/*QTextCursor testedit的光标
要想使操作生效需要调用一下setTextCursor()函数
QTextCursor textCursor=ui->textEdit->textCursor();
textCursor.movePosition(QTextCursor::NextWord, QTextCursor::KeepAnchor); 
ui->textEdit->setTextCursor(textCursor);*/
/*使用insertFragment()来插入已有的文本片段*/
        QTextCursor(tempDoc).insertFragment(d->cursor.selection());
        doc = tempDoc;
    }
    doc->print(printer);
}

你可能感兴趣的:(qt)