2015-01-29 5 views
10

के साथ टेक्स्ट कैसे प्रस्तुत करें क्यूटी के पुराने संस्करण में QGLWidget था, renderText नामक एक अच्छा फ़ंक्शन के साथ। अब मैं QOpenGLWidget कक्षा का उपयोग कर रहा हूं और पाठ प्रस्तुत करने की कार्यक्षमता गुम है।QOpenGLWidget

क्या QOpenGLWidget का उपयोग कर पाठ प्रस्तुत करने का कोई आसान तरीका है? मैं ओपनजीएल के साथ स्क्रैच से पूरे टेक्स्ट प्रतिपादन को बनाना नहीं चाहूंगा ...

+0

https://code.google.com/p/freetype-gl/ –

उत्तर

2

जैसा कि आप 2 डी टेक्स्ट खींचना चाहते हैं, QPainter::drawText() का उपयोग करें। QOpenGLWidget पर QPainter का उपयोग करने के बारे में जानकारी के लिए here देखें। QOpenGLWidgets पर पाठ प्रतिपादन के लिए एंटीअलाइजिंग का उपयोग करने के लिए here देखें।
यदि आप 2.5 डी टेक्स्ट (2 डी पाठ 3 डी दृश्य के साथ चलते हुए) को आकर्षित करना चाहते हैं तो यह अपने स्वयं के वर्गों को रोल करने के लिए "बहुत कठिन" नहीं है। अपने फ़ॉन्ट ग्लाइफ के लिए बनावट बनाने के लिए QFont और QFontMetricsF का उपयोग करें, प्रत्येक ग्लिफ़ के लिए कुछ क्वाड बनाएं और एक स्ट्रिंग में ग्लाइफ के लिए उचित क्वाड बनाएं ...

1

आप इस कार्यक्षमता को स्वयं के आधार पर कार्यान्वित कर सकते हैं पुराना क्यूटी स्रोत कोड।

अपने ओपन विजेट QOpenGLWidget से विरासत में मिली कक्षा में (इस उदाहरण में यह GLBox है) आप निम्न विधियों में लागू करने के लिए है:

renderText:

void GLBox::renderText(D3DVECTOR &textPosWorld, QString text) 
{ 
    int width = this->width(); 
    int height = this->height(); 

    GLdouble model[4][4], proj[4][4]; 
    GLint view[4]; 
    glGetDoublev(GL_MODELVIEW_MATRIX, &model[0][0]); 
    glGetDoublev(GL_PROJECTION_MATRIX, &proj[0][0]); 
    glGetIntegerv(GL_VIEWPORT, &view[0]); 
    GLdouble textPosX = 0, textPosY = 0, textPosZ = 0; 

    project(textPosWorld.x, textPosWorld.y, textPosWorld.z, 
       &model[0][0], &proj[0][0], &view[0], 
       &textPosX, &textPosY, &textPosZ); 

    textPosY = height - textPosY; // y is inverted 

    QPainter painter(this); 
    painter.setPen(Qt::yellow); 
    painter.setFont(QFont("Helvetica", 8)); 
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); 
    painter.drawText(textPosX, textPosY, text); // z = pointT4.z + distOverOp/4 
    painter.end(); 
} 

परियोजना:

inline GLint GLBox::project(GLdouble objx, GLdouble objy, GLdouble objz, 
    const GLdouble model[16], const GLdouble proj[16], 
    const GLint viewport[4], 
    GLdouble * winx, GLdouble * winy, GLdouble * winz) 
{ 
    GLdouble in[4], out[4]; 

    in[0] = objx; 
    in[1] = objy; 
    in[2] = objz; 
    in[3] = 1.0; 
    transformPoint(out, model, in); 
    transformPoint(in, proj, out); 

    if (in[3] == 0.0) 
     return GL_FALSE; 

    in[0] /= in[3]; 
    in[1] /= in[3]; 
    in[2] /= in[3]; 

    *winx = viewport[0] + (1 + in[0]) * viewport[2]/2; 
    *winy = viewport[1] + (1 + in[1]) * viewport[3]/2; 

    *winz = (1 + in[2])/2; 
    return GL_TRUE; 
} 

और अंत में ट्रांसफॉर्म करें:

inline void GLBox::transformPoint(GLdouble out[4], const GLdouble m[16], const GLdouble in[4]) 
{ 
#define M(row,col) m[col*4+row] 
    out[0] = 
     M(0, 0) * in[0] + M(0, 1) * in[1] + M(0, 2) * in[2] + M(0, 3) * in[3]; 
    out[1] = 
     M(1, 0) * in[0] + M(1, 1) * in[1] + M(1, 2) * in[2] + M(1, 3) * in[3]; 
    out[2] = 
     M(2, 0) * in[0] + M(2, 1) * in[1] + M(2, 2) * in[2] + M(2, 3) * in[3]; 
    out[3] = 
     M(3, 0) * in[0] + M(3, 1) * in[1] + M(3, 2) * in[2] + M(3, 3) * in[3]; 
#undef M 
} 

आप renderText() की जरूरत है, क्योंकि आप बंदरगाह के लिए है Qt5 करने के लिए अपने क्यूटी 4 आवेदन सिर्फ

void GLBox::renderText(double x, double y, double z, const QString & str, const QFont & font = QFont(), int listBase = 2000) 

करने के लिए यहाँ उपलब्ध कराई समारोह के हस्ताक्षर को बदलने के लिए सुनिश्चित करें और आप इस बारे में चिंता करने की जरूरत नहीं है ।

3

मैंने @jaba द्वारा लिखे गए समाधान के समान समाधान किया। मैंने कुछ ग्राफिकल भ्रष्टाचार को तब तक देखा जब तक कि मैंने विधि के अंत में चित्रकार.एंड() कहा।

void MapCanvas::renderText(double x, double y, double z, const QString &str, const QFont & font = QFont()) { 
    // Identify x and y locations to render text within widget 
    int height = this->height(); 
    GLdouble textPosX = 0, textPosY = 0, textPosZ = 0; 
    project(x, y, 0f, &textPosX, &textPosY, &textPosZ); 
    textPosY = height - textPosY; // y is inverted 

    // Retrieve last OpenGL color to use as a font color 
    GLdouble glColor[4]; 
    glGetDoublev(GL_CURRENT_COLOR, glColor); 
    QColor fontColor = QColor(glColor[0], glColor[1], glColor[2], glColor[3]); 

    // Render text 
    QPainter painter(this); 
    painter.setPen(fontColor); 
    painter.setFont(font); 
    painter.drawText(textPosX, textPosY, text); 
    painter.end(); 
} 
+0

मैं यहाँ अपने ब्लॉग पर इस बारे में और अधिक पोस्ट: http://nils.schimmelmann.us/post/134971073937/migrating-from -qglwidget करने वाली qopenglwidget –