Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt] вывод текста в OpenGL 
V
    Опции темы
gordmiand
Дата 10.3.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



Каким образом (какой исп-ся метод?) можно вывести определенный текст в заданное место OpenGL-виджета? 
В классе QGLWidget есть метод renderText:
В хидере класса объявляю данный метод:
Код

  void renderText ( int x, int y, const QString & str, const QFont & font = QFont(), int listBase = 2000 );


В cpp-шнике (в методе paintGL()):
Код

QFont shrift("Times", 10, QFont::Bold);
renderText (50, 50, "Привет", shrift,  2000 );

пишет, что undefined reference to `класс::renderText(int, int, QString const&, QFont const&, int)… так как же правильно использовать данный метод вывода текста в виджет opengl-я?
PM MAIL   Вверх
kemiisto
Дата 10.3.2010, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

Репутация: 8
Всего: 160



Цитата(gordmiand @  10.3.2010,  12:49 Найти цитируемый пост)
В хидере класса объявляю данный метод:

На кой ляд Вы чего-то там объявляете? Если Вы наследуетесь от QGLWidget то все методы предка Вам доступны в наследнике. А Вы метод  перекрываете новым объявлением, но реализации не предоставляете.

Цитата(gordmiand @  10.3.2010,  12:49 Найти цитируемый пост)
так как же правильно использовать данный метод вывода текста в виджет opengl-я? 

Сначала надо язык выучить, а потом программы писать. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
gordmiand
Дата 10.3.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



согласен - с объявлением я погорячился....теперь другая проблема:
если код
Код

    glColor3f(1,1,1);
    QFont shrift("Times", 12, QFont::Bold);
    renderText (150, 30, "HELLO", shrift,  2000 );

запускаю непосредственно из paintGL, то текст выводится (все верно), а если переношу сей код в функцию (fig_mod1) одного из классов (Mode1 - приходится делать его наследником от QGLWidget), запускаемую из того же paintGL, то вообще ничего не выводится (даже рисунок другого класса Mode2), хотя и нет ошибок – см. прилагаемую программу… ну что тут не так? А вообще вывод надписи и построения графических элементов надо запихнуть в отдельный класс Figures и вызывать эти методы в функциях классов Mode1 и Mode2… 

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  Proj9_03.rar 18,62 Kb
PM MAIL   Вверх
kemiisto
Дата 10.3.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

Репутация: 8
Всего: 160



Боже!

Фуф... Я даже не знаю, с чего и начать.

gordmiand, Вы не с Delphi, случайно, переходите? Сдаётся мне, что именно так.

Что Вам известно про ООП, кроме того как расшифровывается эта аббревиатура? Правильный ответ - ничего. Я молчу, про то, что Вы не знаете С++...

Как обычно это делается. Субклассим QGLWidget:
Код

class GLWidget : public QGLWidget
{
  Q_OBJECT
  ...
  protected:
    void paintGL();
  ...
}


В методе paintGL() пишем код отрисовки.


Цитата(gordmiand @  10.3.2010,  16:58 Найти цитируемый пост)
А вообще вывод надписи и построения графических элементов надо запихнуть в отдельный класс Figures и вызывать эти методы в функциях классов Mode1 и Mode2…

Это можно сделать относительно просто. Посмотрите, например, Hello GL Example. Класс QtLogo. 

Я сейчас как раз одну приладу пишу и тоже такой подход использую. Исходники можно увидеть тут.

НО! Если Вы хотите выводить надписи с помощью renderText(), Вы должны вызвать этот метод для объекта класса QGLViewer, в котором и хотите увидеть надпись. Можно это сделать прямо в методе paintGL() этого объекта, можно куда-то передать указатель/ссылку на этот объект и там где-то через указатель/ссылку вызвать этот метод.

А Вы городите непонятно что...

Это сообщение отредактировал(а) kemiisto - 10.3.2010, 17:48


--------------------
PM MAIL WWW GTalk Jabber   Вверх
gordmiand
Дата 10.3.2010, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



"Субклассим QGLWidget" - и что? у меня тоже есть класс GL_wnd-потомок QGLWidget, в котором я переопределяю метод paintGL()...Вы толком скажите - почему не выводится не только текст, но и фигуры, описанные в классах Mode1 и Mode2?
По поводу renderText - подскажите тогда самый  простой способ вывода текста на gl-виджет типа QGLWidget...
и указанная ссылка на Ваши исходники - какая-то непонятная... где и что именно там выбирать?
PM MAIL   Вверх
kemiisto
Дата 10.3.2010, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

Репутация: 8
Всего: 160



Цитата(gordmiand @  10.3.2010,  21:45 Найти цитируемый пост)
у меня тоже есть класс GL_wnd-потомок QGLWidget, в котором я переопределяю метод paintGL()

Да. Есть. smile И в нём отлично работает метод renderText(), как и обещано. 

Но! Mode1 тоже на кой-то ляд унаследован от QGLWidget. И при вызове Mode1::fig_mod1() внутри GL_wnd::paintGL() происходит что-то жуткое. smile Ты закоментируй вызов и увидишь, что m2->fig_mod2() отработает вполне пристойно...

Ужасный код. Просто smile Ты ничерта не понимаешь. На кой тебе фреймы? На кой... А, делай как "знаешь"! smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
gordmiand
Дата 11.3.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



у меня вообще чего-то мой же проект Proj9_03.rar  не запускается: 
"mingw32-make: No rule to make target `../Qt/2010.01/qt/mkspecs/win32-g++/qmake.conf', needed by `makefile'. Stop." наверное файл какой из проекта нечаянно удалил...да это не суть...
главное:
1. А как же мне класс Mode1  не наследовать от QGLWidget, если в методе fig_mod1() используются opengl-функции?
2.  почему при вызове Mode1::fig_mod1() внутри GL_wnd::paintGL() должно происходить что-то жуткое, а не вывод надписи HELLO и красного квадрата?
3. подскажите пож-та лучшую организацию (код) взаимодействия таких классов с учетом того, что:
класс GL_wnd является "базовым" потомком gl-виджета QGLWidget, в методе paintGL которого вызываются различные методы классов Mode1 и Mode2, фигуры в которых строятся методами из класса Figures...
4. фреймы используются в качестве виджетов-контейнеров, в которые грузятся различные формы (Form2 и Form3)...


Это сообщение отредактировал(а) gordmiand - 11.3.2010, 00:07
PM MAIL   Вверх
kemiisto
Дата 11.3.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

Репутация: 8
Всего: 160



gordmiand, скажите, что хотите получить в итоге. Как должно выглядеть и работать приложение?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
gordmiand
Дата 11.3.2010, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



 Приложение следующее (в принципе то же самое что я написал чуть выше):
- на главную MainWindow-форму (в ее пресловутые фреймы) грузятся различные формы Form2 и Form3.
- есть класс GL_wnd - он является "базовым" (и единственным?) потомком gl-виджета QGLWidget. 
-  по кнопке Режим1 (с формы Form3) в методе paintGL класса GL_wnd должны выводиться (вызываться) только  OpenGL-фигуры, описанные в классе Mode1 (см. мой метод fig_mod1()), по клику кнопки Режим2 - фигуры, описанные в классе Mode2 (см. мой метод fig_mod2()), а по кнопке Режим3 - выводится только Label с формы Form2.
Этот мой gl-виджет (указатель на экземпляр класса GL_wnd) создается и выводится (show()) в классе Form2 - см. методы show_Label и show_GLscena...
В свою очередь фигуры в методах классов Mode1 и Mode2 строятся с использованием методов из класса Figures (см. мой закомментированный указатель на экземпляр fig1 класса Figures в fig_mod1())...

 




PM MAIL   Вверх
kemiisto
Дата 11.3.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

Репутация: 8
Всего: 160



gordmiand, Вам дали в Университете задание? Так? Вот его мне и перескажите!

Не надо мне набирать про фреймы и т.д. и т.п. На кой они нужны. Без них справимся.

Тут не ваш(а) одногруппник(ца)? smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
gordmiand
Дата 11.3.2010, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



ну да, в инсте...а я Вам задание в принципе и описал в предыдущем сообщении... 
а про "одногруппницу" не уверен...
PM MAIL   Вверх
kemiisto
Дата 11.3.2010, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

Репутация: 8
Всего: 160



gordmiand, если надо использовать фреймы, то я умываю руки. Я с ними не работал и не собираюсь...


--------------------
PM MAIL WWW GTalk Jabber   Вверх
gordmiand
Дата 11.3.2010, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



да совершенно не обязательно их использовать...просто я через них делал... 
главное соблюсти указанную выше иерархию классов+ разобраться с выводом текста...
PM MAIL   Вверх
kemiisto
Дата 11.3.2010, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

Репутация: 8
Всего: 160



gordmiand, завтра с утра занят буду. 

Пока разберись с "каркасом" приложения.

Во-первых, не будем использовать *.ui. Это overhead для учебных примеров.
Во-вторых, у нас "хитрый"
Код
class GLWidget : public QGLWidget

Обрати внимание на private секцию
Код

private:
  enum State
  {
    State1,
    State2,
    State3
  };

  State state;

Переменную state мы используем в методе GLWidget::paintGL()
Код

  switch (state)
  {
  case State1:
    glColor3f(1.0f, 0.0f, 0.0f);
    renderText(20, 20, "State1");
    break;
  case State2:
    glColor3f(0.0f, 1.0f, 0.0f);
    renderText(20, 20, "State2");
    break;
  case State3:
    glColor3f(0.0f, 0.0f, 1.0f);
    renderText(20, 20, "State3");
    break;
  }

В зависимости от текущего состояния мы будем отрисовывать разные сценки. Пока тут только "заглушки" в виде renderText(). 

Смена состояний осуществляется через сигналы-слоты. Смотри конструктор класса Window:
Код

  connect(button1, SIGNAL(clicked()),
          glWidget, SLOT(setState1()));
  connect(button2, SIGNAL(clicked()),
          glWidget, SLOT(setState2()));
  connect(button3, SIGNAL(clicked()),
          glWidget, SLOT(setState3()));


Прежде чем мы пойдём дальше, скажи, ты понимаешь уже написанный код?

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  hellogl.zip 3,77 Kb


--------------------
PM MAIL WWW GTalk Jabber   Вверх
gordmiand
Дата 11.3.2010, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



спасибо за уже оказанную помощь...cегодня днем все осознаю - тогда и отпишу....

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

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

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


 




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


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

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