在 Qt 中打印阿拉伯文本的替代方法

问题描述 投票:0回答:1

我正在尝试在 Qt 中打印包含阿拉伯文本的 HTML 网页。一切打印正常,但阿拉伯文本打印不正确。

首先,我尝试了这个:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#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 出现了一些错误。我尝试了其他一些 QWidget,例如 QWebView 和 QWebPage,但最终遇到了更多问题。

现在我问是否有其他方法可以使用 Qt 打印(如 Windows API 或其他)来解决这个问题。

我用:

  • SDK:Qt 5.2.1 和 Qt Creator 3.0.1
  • 操作系统:微软Windows 8

我需要提一下,Qt 可以很好地将阿拉伯文本打印为 PDF。


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

我认为问题与此有关。

c++ qt api printing arabic
1个回答
0
投票

这个:

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

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

 ui->textEdit->setText(htmlArabicPage);

并告诉我发生了什么。

如果你有这个:

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

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

u8"محمد جمال "

其中文本以

UTF-8 编码。

否则,你应该尝试一下“MÈΜÍ ìМа ”是否被很好地解释。试试这个:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.