qt - QPainter drawText() in QGLWidget draw long Chinese text with English upside down -
i use codes below draw text in qglwidget, when text long , mixed chinese(or japanese) english, text becomes upside down. knows why?
ps1: when change qglwidget qwidget, ok.
ps2: qt version 4.8.0, os ubuntu 12.04 64bit
ps3: when firstly draw text image, draw image, ok.
normal when using qwidget:
upside-down when using 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(); }
**
edit:
**
i change font family name "default" "yahei consolas hybrid", becomes normal when drawtext once. when use codes below change text @ intervals, chinese characters become upside down again...
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
#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 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(); }
Comments
Post a Comment