Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] вызов метода класса-родителя 
:(
    Опции темы
gordmiand
Дата 12.3.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Программа Proj12_03.rar:

Сделал класс Mode1 наследником от Figures, который в свою очередь является потомком от QGLWidget. В paintGL-методе вызываю метод fig_mod1() класса Mode1 по построению фигуры и вывода надписи (эти 2 метода (Figura1 и Nadpis) описываются в классе Figures)
Почему тогда фигура выводится на экран, а надпись – нет (ни если ее пытаться вызывать принудительно в методе fig_mod1(), ни если через метод Nadpis)? Чем Nadpis() хуже Figura1() и как их корректно вывести на экран, вызвав из одного метода (fig_mod1) ?

И что за магический макрос Q_OBJECT в описании класса-потомка от QGLWidget – если я его указываю в классе Figures, то возникает ошибка “undefined reference to `vtable for Figures” и перелетает на конструктор сего класса (что это за ошибка, как ее исправить и когда надо указывать Q_OBJECT???) 


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Proj12_03.rar 19,28 Kb
PM MAIL   Вверх
JackYF
Дата 12.3.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(gordmiand @  12.3.2010,  17:45 Найти цитируемый пост)
И что за магический макрос Q_OBJECT

Ответ на второй вопрос: документацию (в частности, первые уроки Tutorial'а) читал? Там чётко рассказывается, что он есть и зачем он нужен.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
gordmiand
Дата 12.3.2010, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да это не главное - главное, чтобы программа Proj12_03.rar заработала верно - то есть чтобы выводились на экран и фигура, и надпись, определенные в соответсвующих методах стороннего класса...посмотрите пож-та данную программу....
PM MAIL   Вверх
kemiisto
Дата 13.3.2010, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Тема "уплыла" отсюда. Юзернейм абсолютный ноль в ООП, как впрочем и в программировании. Проект программистам с расшатанной психикой открывать не советую.

При этом советам не внимает. Просто игнорирует любые попытки помочь. Пихает и пихает свой ###код. smile 




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


Опытный
**


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

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



kemiisto: ну почему-же я "игнорирую любые попытки мне помочь"? Вы же так и остановились на полдороги в предыдущей теме по данному вопросу и не ответили  - почему описанные в одном методе фигура выводится на gl-виджет, а текст (методом renderText)- нет (проект см. выше)? А за подсказку более правильной иерархии классов в соответствии с заданием, указанным в предыдущей теме, буду только благодарен... 
PM MAIL   Вверх
kemiisto
Дата 13.3.2010, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



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


Если ты не понимаешь - тебе в "Центр помощи". Хотя всё равно бесполезно. Ты задачу-то толком сформулировать не можешь. Как её в таком случае решать?


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


Опытный
**


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

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



Задача у меня сейчас одна - в классе Figures сделать метод, наиболее простым способом реализующий вывод заданного текста (можно еще и шрифт с размером задавать) в заданное место gl-виджета...Если самое простое для вывода надписей - это использование метода renderText, то подскажиет пож-та программную реализацию сего действия (можно прямо в проекте)...я ж токо учусь....


PM MAIL   Вверх
SABROG
Дата 13.3.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 81
Всего: 91



Как бы там ни было. По умолчанию в Qt 4.6+ используется дижок OpenGL2, если Qt его находит в ОС. QGLWidget::renderText() работает только с движком OpenGL и только в обвязке painter.beginNativePainting();/painter.endNativePainting();. Из всего этого следует, что нужно включить старый движок OpenGL:

Код

#include <QtGui/QApplication>
#include <QtOpenGL>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QGL::setPreferredPaintEngine(QPaintEngine::OpenGL);
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}


И сделать обвязку.
Код

void GL_wnd::paintGL()
{
    QPainter painter(this);
    painter.beginNativePainting();
    m1->fig_mod1();
    painter.endNativePainting();


У меня это привело к тому, что черный квадрат пропадает и фигура уменьшается в размерах, а вместо текста я вижу какие-то точки. Толи где-то настройки не подкрутил, толи еще что. Но тролли рекомендуют использовать QPainter::drawText() и OpenGL2:
Код

void GL_wnd::paintGL()
{
    QPainter painter(this);
    painter.beginNativePainting();

    m1->fig_mod1();

    painter.drawText(QPointF(50.0,50.0), "test");
    painter.endNativePainting();
}


И этот код работает нормально.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
gordmiand
Дата 13.3.2010, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SABROG: во-первых, я не знаю -  работает ли renderText() только с движком OpenGL, а не с OpenGL2, но если вставить 
Код

  glColor3f(1,1,1);
    renderText (50, 50, "Hello everybody");
 
непосредственно в сам paintGL (а не через метод пытаться вывести сию надпись ), то текст замечательно выводится и в QT 4.6 без всяких обвязок и т.п....
во -вторых приведенный Вами последний код не работает нормально: черный квадрат пропадает и фигура уменьшается в размерах...
PM MAIL   Вверх
SABROG
Дата 13.3.2010, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 81
Всего: 91



Ты создаешь 2 виджета QGLWidget, один gl_wnd.cpp, другой mode1.cpp. И пытаешься рисовать методами одного QGLWidget'a на другом QGLWidget'e.

Это сообщение отредактировал(а) SABROG - 13.3.2010, 01:27


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
gordmiand
Дата 13.3.2010, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SABROG: все равно не вариант:
Код

void GL_wnd::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      QPainter painter(this);
       painter.beginNativePainting();

      // m1->fig_mod1();

       painter.drawText(QPointF(50.0,50.0), "test");
       painter.endNativePainting();
}
 
эффект тот же - даже при попытке вывести только одну надпись таким способом...подскажите лучше как сделать: "Если Вы хотите выводить надписи с помощью renderText(), Вы должны вызвать этот метод для объекта класса QGLViewer, в котором и хотите увидеть надпись. Можно это сделать прямо в методе paintGL() этого объекта, можно куда-то передать указатель/ссылку на этот объект и там где-то через указатель/ссылку вызвать этот метод"
PM MAIL   Вверх
SABROG
Дата 13.3.2010, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 81
Всего: 91



Переопределяй paintGL() у каждого экземпляра класса: mode1, mode2. У тебя аж 3 QGLWidget'a, а рисовать пытаешься только на одном, причем методами других виджетов.

Это сообщение отредактировал(а) SABROG - 13.3.2010, 01:31


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
gordmiand
Дата 13.3.2010, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



и как же мне тогда визуализировать сразу несколько QGLWidget-виджетов (т.е. вызывать их PaintGL)? да и зачем? одного мало? я так и задумывал - только на виджете GL_wnd я рисую фигуры, которые строятся в других классах (Mode1 и Mode2), которые в свою очередь являются наследниками от их общего класса Figures:QGLWidget (чтобы иметь возможность использовать в его методах функции OpenGL)

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


Опытный
**


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

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



kemiisto: и где Вы вообще нашли такой класс, как QGLViewer? ну подскажите как программно с помощью него использовать renderText в моем paintGL-е? 
PM MAIL   Вверх
SABROG
Дата 13.3.2010, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 81
Всего: 91



Одно дело наследоваться и совсем другое пытаться работать с экземпляром базового класса думая при этом, что пытаешься вызвать методы базового класса в контексте данных дочернего класса.


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

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

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


 




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


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

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