在qt中打印阿拉伯文字的另一种方法

时间:2014-02-14 21:38:42

标签: c++ qt api printing arabic

我正在尝试在Qt中打印包含阿拉伯文字的HTML网页。一切都打印得很好,但阿拉伯文字打印不正确。

首先我尝试了这个:

#include "mainwindow.h"
#include "ui_mainwindow.
#include <QtPrintSupport/QPrinter>
#include <QString>
#include <QtPrintSupport/QPrintDialog>
#include <QTextDocument>
#include <QFile>
#include <QDir>
#include <QFileDialog>
#include <QTextCodec>
#include <QtWebKitWidgets/QWebPage>
#include <QtWebKitWidgets/QWebView>
#include <QtWebKitWidgets/QWebFrame>


QString htmlItem(QString Item)
{
    QString r="";
    r.append( "<td>"
               "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:'Tahoma'; font-size:9pt; font-weight:600;\">");
    r.append(Item);
     r.append("</span></p></td>");
    return r;
}

QString htmlRow(QString MFC,QString MFT,QString D,QString N)
{
    QString ret ="" ;
    ret.append("<tr>");

    ret.append(htmlItem(MFC));
    ret.append(htmlItem(MFT));
    ret.append(htmlItem(D));
    ret.append(htmlItem(N));
   ret.append("</tr>");
    return ret;
}

QString htmlTable(QString rows)
{
    QString ret = "";
    ret.append("<table border=\"1\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;\" align=\"center\" width=\"90%\" cellspacing=\"0\" cellpadding=\"4\">"
            "<tbody>");
    ret.append(rows);
    ret.append("</tbody></table>");
    return ret ;
}
QString htmlClientName(QString name)
{
    QString retu="<p align=\"center\" style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\""
            "font-family:&#39;Tahoma&#39;; font-size:16pt; font-weight:600;\">";
    retu.append(name);
    retu.append("</span></p>");
    return  retu;
}

QString htmlClientPage(QString Table,QString Name)
{
    QString r = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">"
            "<!-- saved from url=(0045)file:///C:/Users/MG/Desktop/Untitled%201.html "
            "-->"
            "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta name=\"qrichtext\" content=\"1\"><title>QTextEdit Example</title><style "
            "type=\"text/css\">"
            "p, li { white-space: pre-wrap; }"
            "</style></head><body style=\" font-family:&#39;MS Shell Dlg 2&#39;; font-size:8.25pt; font-weight:400; font-"
            "style:normal;\"";
    r.append(htmlClientName(Name));
    r.append(htmlTable(Table));
    r.append("</body></html>");
    return r;
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QString cD="";
    cD.append(htmlRow("m","n","b","v"));
    cD.append(htmlRow("hgfh","n","b","gggg"));
    cD.append(htmlRow("m","vvvv","bbbbbbb","v"));
    cD.append(htmlRow("m","ssssss","b","sssssssss"));
    QString data = htmlClientPage(htmlTable(cD), "???? ???? ");
    ui->textEdit->setText(data);


#if !defined(QT_NO_PRINTER) && !defined(QT_NO_PRINTDIALOG)
    QPrinter printer(QPrinter::HighResolution);
    QPrintDialog *dlg = new QPrintDialog(&printer, this);
    if (ui->textEdit->textCursor().hasSelection())
        dlg->addEnabledOption(QAbstractPrintDialog::PrintSelection);



    dlg->setWindowTitle(tr("Print Document"));
    if (dlg->exec() == QDialog::Accepted)
        ui->textEdit->print(&printer);
    delete dlg;
#endif

}

输出打印文件是这样的:

enter image description here

我搜索了如何解决这个问题,并在打印阿拉伯语文本时结束了Qt中的总和错误。我尝试了其他Qwidgets,如QwebView和QwebPage,最终遇到了更多问题。

现在我问是否有其他方法可以使用Qt打印,例如 Windows API或其他来解决此问题。

我用左 SDK:Qt 5.2.1与Qt Creator 3.0.1
操作系统:Microsoft Windows 8

编辑:我需要提一下,Qt将阿拉伯语文本打印成PDF格式。

编辑:我很确定问题不是编码。我搜索了这个问题,我在Qt中发现了这些错误:

https://bugreports.qt-project.org/browse/QTBUG-4452?page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel

我认为问题与此问题有关。

1 个答案:

答案 0 :(得分:0)

此:

 QString str = QString::fromLocal8Bit(data.toLocal8Bit());

对我来说没有意义。我不确定它是否有效,但请尝试以下方法:

 ui->textEdit->setText(htmlArabicPage);

并告诉我会发生什么。

如果你有这个:

 htmlClientPage(htmlTable(cD),"محمد جمال ");

在您的来源代码中,您应该非常小心。如果你想在C ++ 11中创建一个Unicode文字,那么你应该这样做:

 u8"محمد جمال "

文本以 UTF-8 编码。

否则,你应该尝试解释“محمدجمال”。试试这个:

#include <QString>
#include <QDebug>

int main()
{
    qDebug() << QString::fromUtf8("محمد جمال ");
    qDebug() << QString::fromLocal8Bit("محمد جمال ");
    return 0;
}

您发布的错误来自之前版本的Qt,并已关闭。