[英]QPainter drawText() in QGLWidget draw long Chinese text with English upside down
I use codes below to draw text in QGLWidget, but when the text is long and mixed Chinese(or Japanese) with English, then the text becomes upside down. 我使用下面的代码在QGLWidget中绘制文本,但是当文本较长且中文(或日语)与英语混合时,则文本会上下颠倒。 Anyone knows why? 有人知道为什么吗?
PS1: When I change QGLWidget to QWidget, everything is OK. PS1:当我将QGLWidget更改为QWidget时,一切正常。
PS2: My Qt version is 4.8.0, OS is Ubuntu 12.04 64bit PS2:我的Qt版本是4.8.0,操作系统是Ubuntu 12.04 64bit
PS3: When I firstly draw the text into an image, then draw that image, everything is ok. PS3:当我首先将文本绘制成图像,然后绘制该图像时,一切正常。
Normal when using QWidget: 使用QWidget时正常:
Upside-down when using QGLWidget: 使用QGLWidget时倒置:
mainwindow.h 主窗口
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QGLWidget>
class MainWindow : public QGLWidget
{
Q_OBJECT
public:
explicit MainWindow(QGLWidget *parent = 0);
protected:
void paintEvent(QPaintEvent* event);
};
#endif // MAINWINDOW_H
mainwindow.cpp 主窗口
MainWindow::MainWindow(QGLWidget *parent) : QGLWidget(parent)
{
setGeometry(0, 0, 1000, 200);
}
void MainWindow::paintEvent(QPaintEvent* event) {
QPainter painter;
painter.begin(this);
QString text = QString::fromLocal8Bit(
"THIS IS一段A很长的LONG示例文本TEXT。在非常长的时候会出现上下 颠倒的问题。你那里是否出现了?" \
"一段很长的示例文本。在非常长的时候会出现上下颠倒的问题。你那里是否出现了?" \
"一段很长的示例文本。在非常长的时候会出现上下颠倒的问题。你那里是否出现了?"
);
painter.setFont(QFont("default", 46, -1, false));
painter.drawText(QRect(0, 0, 3000, 200), Qt::TextSingleLine, text);
painter.end();
}
** **
** **
I change font family name "default" to "YaHei Consolas Hybrid", it becomes normal when only drawText once. 我将字体系列名称“默认”更改为“ YaHei Consolas Hybrid”,仅一次drawText时,它就很正常。 But When I use codes below to change text at intervals, the Chinese Characters become upside down again... 但是,当我使用下面的代码间隔更改文本时,汉字又变得颠倒了...
MainWindow.cpp MainWindow.cpp
#include <QtGui>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QGLWidget *parent) : QGLWidget(parent)
{
setGeometry(0, 0, 2000, 100);
paintTimer = new QTimer(this);
connect(paintTimer, SIGNAL(timeout()), this, SLOT(repaint()));
paintTimer->start(16);
text1 ="【中文1024测试】ABCDEFGHIJKLMNOPQRSTUVWXYZ中文ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
"中文ABCDEFGHIJKLMNOPQRSTUVWXYZ中文ABCDEFGHIJKLMN";
text2 = "中文English中文English中文English中文English中文Englis中文";
text = text2;
offset = 0;
}
void MainWindow::paintEvent(QPaintEvent* event) {
QPainter painter;
painter.begin(this);
painter.setFont(QFont("YaHei Consolas Hybrid", 40, -1, false));
painter.drawText(QRect(0, 0, 3000, 100), Qt::TextSingleLine, text);
painter.end();
offset= (offset + 8) %400;
if (offset > 200) {
text = text1;
} else {
text = text2;
}
}
MainWindow.h MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QGLWidget>
#include <QTimer>
#include <QFont>
class MainWindow : public QGLWidget
{
Q_OBJECT
public:
explicit MainWindow(QGLWidget *parent = 0);
protected:
void paintEvent(QPaintEvent* event);
private:
QTimer* paintTimer;
QString text1;
QString text2;
QString text;
int offset;
};
#endif // MAINWINDOW_H
The codes below can solve the upside down problem: 以下代码可以解决倒置问题:
void MainWindow::paintEvent(QPaintEvent* event) {
qglClearColor(QColor(0,0,0));
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
QPainter painter(this);
painter.beginNativePainting();
renderText(-offset, 60, 0, text, QFont("YaHei Consolas Hybrid", 40, 1, false));
painter.endNativePainting();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.