Russian Qt Forum
Ноябрь 23, 2024, 00:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виджеты на QGraphicsScene  (Прочитано 10038 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Май 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?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Май 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
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Май 05, 2011, 12:39 »

Цитировать
Подозреваю что виджеты мне надо наследовать так?
Нет не так. В Qt позволительно множественное наследование только от одного базового QObject.
Записан

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Май 05, 2011, 14:41 »

хорошо, тогда как мне создать виджет, который бы повторял собой QLCDNumber, но был наследником от QGraphicsObject?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Май 05, 2011, 14:44 »

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

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Май 05, 2011, 15:26 »

Сделал. Но одна проблема, такие виджеты не перемещаются и не выделяются мышью на сцене.
Установка флагов ничего не дает. Есть идеи?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Май 06, 2011, 00:29 »

Если кому то интересно, сделал класс наследник QMovableGraphicsProxyWidget, который как раз компенсирует этот недостаток + позволяет динамически менять размеры виджета (с помощью анкеров).
Итого имеем полноценное петераскивание виджетов и изменение их размеров в рантайме.
Если нужно, выложу исходник.
« Последнее редактирование: Май 06, 2011, 12:26 от Fregloin » Записан
danquimby
Гость
« Ответ #7 : Май 06, 2011, 13:17 »

Если кому то интересно, сделал класс наследник QMovableGraphicsProxyWidget, который как раз компенсирует этот недостаток + позволяет динамически менять размеры виджета (с помощью анкеров).
Итого имеем полноценное петераскивание виджетов и изменение их размеров в рантайме.
Если нужно, выложу исходник.

Спасибо, бум смотреть  Улыбающийся
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Май 06, 2011, 16:21 »

с перемещением и изменением размеров разобрался.
проблема в следующем - сцена никак не реагирует на выделение виджетов.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #9 : Июль 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 но внутренняя реализация этих классов разна, первы отвечает за простые элементы, второй за встроенные виджеты на сцене.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Июль 01, 2014, 17:29 »

Второй отнаследуй от ItemClass и инкапсулируй в него QGraphicsProxyWidget.
« Последнее редактирование: Июль 01, 2014, 17:31 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Июль 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();
};
 
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Июль 01, 2014, 18:27 »

+1, так, конечно, правильнее.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 22.