我正在尝试在 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:'Tahoma'; 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:'MS Shell Dlg 2'; 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
}
输出的打印文件是这样的:
我搜索了如何解决这个问题,结果在打印阿拉伯文本时 Qt 出现了一些错误。我尝试了其他一些 QWidget,例如 QWebView 和 QWebPage,但最终遇到了更多问题。
现在我问是否有其他方法可以使用 Qt 打印(如 Windows API 或其他)来解决这个问题。
我用:
我需要提一下,Qt 可以很好地将阿拉伯文本打印为 PDF。
我很确定问题不是编码。我搜索了这个问题,发现了 Qt 中的这些错误:
我认为问题与此有关。
这个:
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的先前版本,并且已被关闭。