Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Fregloin от Май 05, 2011, 11:29



Название: Виджеты на QGraphicsScene
Отправлено: Fregloin от Май 05, 2011, 11:29
На сцене нужно отобразить кучу itemов (в основном полигоны, линии, круги и прочее, наследованы от QGraphicsItem).
Теперь возникла задача, на этой же сцене отображать виджеты (QLCDNumber, QListWidget, QPushButton). С отображением через addWidget проблем нет.
Но виджет, который добавился на сцену не передвигается мышью, как например другие элементы, которые наследованы от QGraphicsItem.
И еще впорос:
Если я в наследнике QGraphicsItem (назевоем его QRailItem), добавил поля (qint32 objectType, и прочее ...), потом от QRailItem тоже наследуется много классов.
Мне нужно что бы виджеты, которые добавляются на сцену тоже были наследниками QRailItem, или имели такие же поля как в QRailItem. Как сделать? Догадываюсь про множественное наследование, но пока еще не пойму как конкретно.
Вот частичное описание класса QRailItem, от которого наследуются все классы отображаемых элементов на сцене
Код:
class QRailItem : public    QObject,    public QGraphicsItem
{
    Q_OBJECT
    Q_INTERFACES (QGraphicsItem)

protected:

    bool            fupdating;
    QString         fname;
    TObjectType     fobjectType;
...
};
Как видно, класс наследуется от QObject и QGraphicsItem.
Подозреваю что виджеты мне надо наследовать так?
Код:
class QRailItem : public    QLCDNumber,    public QGraphicsWidget
{
    Q_OBJECT
    Q_INTERFACES (QGraphicsWidget)
...
}
А как получить теже поля что и у QRailItem?
Или вынести их все в отдельный класс, и множественным наследованием получить их уже в QRailItem и наследнике QGraphicsWidget?


Название: Re: Виджеты на QGraphicsScene
Отправлено: Fregloin от Май 05, 2011, 11:43
Код:
#include <QLCDNumber>
#include <QDateTime>
#include <QGraphicsWidget>
#include <time.h>

class SCB_DigitalClock : public QLCDNumber ,public QGraphicsWidget
{
    Q_OBJECT
    Q_INTERFACES(QGraphicsWidget)

    QDateTime   dt;
    time_t      oldTime;

public:
    explicit SCB_DigitalClock(QWidget *parent = 0);
    void     showTime(time_t * time_value);

signals:

public slots:

    void    updateTime(time_t ATime);

};

При компиляции ругается Error: Undefined interface


Название: Re: Виджеты на QGraphicsScene
Отправлено: GreatSnake от Май 05, 2011, 12:39
Цитировать
Подозреваю что виджеты мне надо наследовать так?
Нет не так. В Qt позволительно множественное наследование только от одного базового QObject.


Название: Re: Виджеты на QGraphicsScene
Отправлено: Fregloin от Май 05, 2011, 14:41
хорошо, тогда как мне создать виджет, который бы повторял собой QLCDNumber, но был наследником от QGraphicsObject?


Название: Re: Виджеты на QGraphicsScene
Отправлено: GreatSnake от Май 05, 2011, 14:44
Никак.
Но можно сделать ход конём)
Наследуйся от QGraphicsProxyWidget. В его конструкторе создавай QLCDNumber и помещай его в QGraphicsProxyWidget через setWidget().
Прописываешь интерфейс к QLCDNumber.


Название: Re: Виджеты на QGraphicsScene
Отправлено: Fregloin от Май 05, 2011, 15:26
Сделал. Но одна проблема, такие виджеты не перемещаются и не выделяются мышью на сцене.
Установка флагов ничего не дает. Есть идеи?


Название: Re: Виджеты на QGraphicsScene
Отправлено: Fregloin от Май 06, 2011, 00:29
Если кому то интересно, сделал класс наследник QMovableGraphicsProxyWidget, который как раз компенсирует этот недостаток + позволяет динамически менять размеры виджета (с помощью анкеров).
Итого имеем полноценное петераскивание виджетов и изменение их размеров в рантайме.
Если нужно, выложу исходник.


Название: Re: Виджеты на QGraphicsScene
Отправлено: danquimby от Май 06, 2011, 13:17
Если кому то интересно, сделал класс наследник QMovableGraphicsProxyWidget, который как раз компенсирует этот недостаток + позволяет динамически менять размеры виджета (с помощью анкеров).
Итого имеем полноценное петераскивание виджетов и изменение их размеров в рантайме.
Если нужно, выложу исходник.

Спасибо, бум смотреть  :)


Название: Re: Виджеты на QGraphicsScene
Отправлено: Fregloin от Май 06, 2011, 16:21
с перемещением и изменением размеров разобрался.
проблема в следующем - сцена никак не реагирует на выделение виджетов.


Название: Re: Виджеты на QGraphicsScene
Отправлено: Fregloin от Июль 01, 2014, 17:16
Помогите составить правильную иерархию классов.

Допустим на сцене надо отображать помимо экземпляров наследников QGraphicsItem также экземпляры QGraphicsProxyWidget.
При этому часть свойств у этих классов должна совпадать, как минимум id.

Пути решения несколько, но пока не понимаю как по человечески сделать.

т.е. как правильно описать классы, что бы работа с ними на сцене была прозрачна.

Код:
class ItemClass: public QGraphicsItem
{
public:
int  id;
virtual void load();
virtual void save();
};

class WidgetClass: public QGraphicsProxyWidget
{
public:
int id:
virtual void load();
virtual void save();
}


Т.е. работать как бы с общим интерфейсом id, load/save но внутренняя реализация этих классов разна, первы отвечает за простые элементы, второй за встроенные виджеты на сцене.


Название: Re: Виджеты на QGraphicsScene
Отправлено: GreatSnake от Июль 01, 2014, 17:29
Второй отнаследуй от ItemClass и инкапсулируй в него QGraphicsProxyWidget.


Название: Re: Виджеты на QGraphicsScene
Отправлено: Old от Июль 01, 2014, 18:20
Код
C++ (Qt)
class Storage
{
public:
   int  id;
   virtual void load() = 0;
   virtual void save() = 0;
};
 
class ItemClass: public QGraphicsItem, public Storage
{
public:
   virtual void load();
   virtual void save();
};
 
class WidgetClass: public QGraphicsProxyWidget, public Storage
{
public:
   virtual void load();
   virtual void save();
};
 
 


Название: Re: Виджеты на QGraphicsScene
Отправлено: GreatSnake от Июль 01, 2014, 18:27
+1, так, конечно, правильнее.