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