Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод текста в QGLWidget 
V
    Опции темы
math64
Дата 11.9.2015, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Как я понял, использование QGLWidget::renderText() не рекомендуется и предлагается выодить текст как сделано в примере Overpaint.
Но в этом случае текст выводится по двумерным координатам.
Мне нужно, чтобы текст был привязан к вершине и передвигался при вращении объекта, но сам не вращался.
PM   Вверх
Amp
Дата 11.9.2015, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Преобразовываешь координаты вершины в экранные и рисуешь текст по этим координатам. Либо через gluProject, либо самому, имея на руках матрицы моделирования и проекции.
PM MAIL   Вверх
math64
Дата 14.9.2015, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Почему-то как только создаю painter, всё стирается, даже если ничего не рисую.
Вот здесь предлагают использовать текстуру для вывода текста:
http://www.prog.org.ru/topic_27706_0.html
Ещё один способ:
http://www.prog.org.ru/topic_1574_0.html
Но в моей версии Qt нет QImage::setAlphaBuffer(), а если рисую прямо в QImage без QPixmap, вылетаю на QGLWidget::convertToGLFormat() (перед ним нужно было вызвать painter.end(): "QPaintDevice: Cannot destroy paint device that is being painted").

Использование gluProject() c renderText() из второй ссылки:
Код

void renderText(QGLWidget* w, int x, int y,
                const QString& text,
                const QColor& col = Qt::white, const QFont& font = QFont() )
{
    glMatrixMode( GL_PROJECTION );
    glPushMatrix();
    glLoadIdentity();
    glOrtho( 0, w->width(), w->height(), 0, 0, 1 );
    glMatrixMode( GL_MODELVIEW );
    glPushMatrix();
    glLoadIdentity();

    QFontMetrics fm(font);
    QRect rect = fm.boundingRect(text);

    QImage img(rect.size(), QImage::Format_ARGB32_Premultiplied);
    img.fill(Qt::black);
    QPainter painter(&img);
    painter.setPen( Qt::white );
    painter.setFont( font );
    painter.drawText( -rect.left(), -rect.top(), text );
    painter.end();

    for ( int i = 0; i < img.height(); i++ ) {
        QRgb* rgb = (QRgb*) img.scanLine(i);
        for ( int j = 0; j < img.width(); j++ ) {
            rgb[j] = qRgba(col.red(), col.green(), col.blue(), qRed(rgb[j]) );
        }
    }
    img = QGLWidget::convertToGLFormat(img);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glRasterPos2i( x, y );
    glDrawPixels( rect.width(), rect.height(), GL_RGBA, GL_UNSIGNED_BYTE, img.bits() );
    glDisable(GL_BLEND);
    glMatrixMode( GL_PROJECTION );
    glPopMatrix();
    glMatrixMode( GL_MODELVIEW );
    glPopMatrix();
}

Код

void renderText(QGLWidget* w, double x, double y, double z,
                const QString& text,
                const QColor& col = Qt::white, const QFont& font = QFont() )
{
    double modelMatrix[16];
    double projMatrix[16];
    GLint viewport[4];
    GLdouble winX, winY, winZ;

    glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix);
    glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);
    glGetIntegerv(GL_VIEWPORT,viewport);

    gluProject(x, y, z, modelMatrix, projMatrix, viewport,
               &winX, &winY, &winZ);
    renderText(w, winX, w->height() - winY, text, col, font);
}


Это сообщение отредактировал(а) math64 - 14.9.2015, 13:39
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.2360 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.