crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Множественное наследование QObject, QGraphicsPolygonItem
lifrost
  опции профиля:
сообщение 22.3.2011, 15:07
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 4.3.2011
Из: Миасс
Пользователь №: 2468

Спасибо сказали: 0 раз(а)




Репутация:   0  


Помогите разобраться с множественным наследование. Мне нужны сигналы/слоты в QGraphicsPolygonItem. Решил добавить второго предка QObject:

class WindowItem : public QObject, public QGraphicsPolygonItem
{
    Q_OBJECT

public:
    WindowItem(QGraphicsItem *parent, QGraphicsScene *scene);

....
};


Ругается, пишет "undefined reference to 'vtable for WindowItem' ".

Как быть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 22.3.2011, 15:27
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


гуглить тоже надо)
тут, в конце
http://www.prog.org.ru/topic_10329_0.html



WindowItem(QGraphicsItem *parent, QGraphicsScene *scene);
передавать итему указатель на сцену нет надобности
у итема есть метод:
QGraphicsItem::scene ()

Сообщение отредактировал abc - 22.3.2011, 15:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.3.2011, 7:29
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(lifrost @ 22.3.2011, 17:07) *
Ругается, пишет "undefined reference to 'vtable for WindowItem' ".

когда у меня такая ошибка вылезала (а именно, она вылезала в момент добавления нового класса, производного от QObject и именно как реакция на появление в классе макроса Q_OBJECT), то помогало лишь сделать изменения в файле *.pro (можно просто напечатать пробел, потом его стереть). Затем сборка проходит удачно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lifrost
  опции профиля:
сообщение 23.3.2011, 9:29
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 4.3.2011
Из: Миасс
Пользователь №: 2468

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(abc @ 22.3.2011, 17:27) *
гуглить тоже надо)
тут, в конце
http://www.prog.org.ru/topic_10329_0.html



WindowItem(QGraphicsItem *parent, QGraphicsScene *scene);
передавать итему указатель на сцену нет надобности
у итема есть метод:
QGraphicsItem::scene ()


Убрал указатель на счену (и в правду он там не обязателен). Но что-то на счет множественного наследования не получается (( сделал вот так:

class WindowItem : public QObject, public QGraphicsPolygonItem
{
    Q_OBJECT

public:
    WindowItem(QObject *p=0, QGraphicsItem *parent=0);
....
};


Пишет: "invalid conversion from QObject to int", "initializing argument 1 of QPolygonF::QPolygonF(int)"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 23.3.2011, 9:44
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Может побольше кода предоставишь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lifrost
  опции профиля:
сообщение 23.3.2011, 9:52
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 4.3.2011
Из: Миасс
Пользователь №: 2468

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(PAFOS @ 23.3.2011, 11:44) *
Может побольше кода предоставишь?


// .h
class WindowItem : public QObject, public QGraphicsPolygonItem
{
    Q_OBJECT

public:
    WindowItem(QObject *p=0, QGraphicsItem *parent=0);
    void setupPoint();
protected:
    // полигоны
    QPolygonF lPoly;
    QPolygonF rPoly;
    QPolygonF tPoly;
    QPolygonF bPoly;
    QPolygonF packP;

    QPointF point1;
    QPointF point2;
    QPointF point3;
    QPointF point4;
    QPointF point5;
    QPointF point6;
    QPointF point7;
    QPointF point8;
};

class leftGlume : public WindowItem
{
    Q_OBJECT

public:
    leftGlume(QObject *p=0, QGraphicsItem *parent=0);
    void setupLG();
};


// .cpp

WindowItem::WindowItem(QObject *p, QGraphicsItem *parent) :
        QGraphicsPolygonItem(p, parent)
{
    QPen pen(Qt::black,1);
    setPen(pen);
    setupPoint();
}

void WindowItem::setupPoint()
{
    point1 = QPointF(500,100);
    point2 = QPointF(500,500);
    point3 = QPointF(480,480);
    point4 = QPointF(480,120);
    point5 = QPointF(120,480);
    point6 = QPointF(100,500);
    point7 = QPointF(120,120);
    point8 = QPointF(100,100);

}

leftGlume::leftGlume(QObject *p, QGraphicsItem *parent) : WindowItem(p, parent)
{
}

void leftGlume::setupLG()
{
    // left
    lPoly << point8;
    lPoly << point6;
    lPoly << point5;
    lPoly << point7;

    setPolygon(lPoly);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 23.3.2011, 10:27
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


Цитата(lifrost @ 23.3.2011, 9:52) *
WindowItem::WindowItem(QObject *p, QGraphicsItem *parent) : QGraphicsPolygonItem(p, parent)


Я бы убрал QObject из конструктора, суть здесь ведь в том, чтобы добавить родителя, вот у тебя графикитем может быть родителем
а компилятор выдал ошибку потому что:
: QGraphicsPolygonItem(p, parent) - такого конструктора у полигона просто нет
компилятор находит его конструктор с двумя аргументами, и он звучит так:
QGraphicsPolygonItem ( const QPolygonF & polygon, QGraphicsItem * parent = 0 )
и он не может передать указатель на QObject туда, где речь о QPolygonF

Сообщение отредактировал abc - 23.3.2011, 10:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lifrost
  опции профиля:
сообщение 23.3.2011, 10:33
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 4.3.2011
Из: Миасс
Пользователь №: 2468

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(abc @ 23.3.2011, 12:27) *
Цитата(lifrost @ 23.3.2011, 9:52) *
WindowItem::WindowItem(QObject *p, QGraphicsItem *parent) : QGraphicsPolygonItem(p, parent)


Я бы убрал QObject из конструктора, суть здесь ведь в том, чтобы добавить родителя, вот у тебя графикитем может быть родителем
а компилятор выдал ошибку потому что:
: QGraphicsPolygonItem(p, parent) - такого конструктора у полигона просто нет
компилятор находит его конструктор с двумя аргументами, и он звучит так:
QGraphicsPolygonItem ( const QPolygonF & polygon, QGraphicsItem * parent = 0 )
и он не может передать указатель на QObject туда, где речь о QPolygonF


=) все гениальное просто. Всем спасибо - все работает!
Тема закрыта.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 4:39