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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 [3]
31  Qt / Вопросы новичков / Re: Динамическое создание обьектов : Август 09, 2017, 11:32

[virtual] QGraphicsScene::~QGraphicsScene()
Removes and deletes all items from the scene object before destroying the scene object. The scene object is removed from the application's global scene list, and it is removed from all associated views.
Сцена при разрушении потянет за собой всё своё содержимое.
Вопрос 1: Выходит не нужно устанавливать предка к элементам сцены, поскольку они уничтожаться перед уничтожением сценой?
Код
C++ (Qt)
class my_QGraphicsTextItem : public QGraphicsTextItem
{
   Q_OBJECT
 
public:
   explicit my_QGraphicsTextItem(QGraphicsScene *parent = Q_NULLPTR) // : QGraphicsTextItem (parent) {}
   {}
};
И тут обнаружил что нельзя вызвать конструктор базового класса во втором варианте. Поскольку мой класс в качестве предка принимает сцену, а базовый класс QGraphicsItem. Приходится реализовывать без вызова базового конструктора.

Вопрос 2: Стоит так делать? Или сделать первый вариант?
32  Qt / Вопросы новичков / Re: Динамическое создание обьектов : Август 08, 2017, 19:19
5. Зачем кнопке делать родителя кнопку? Вы делаете виджет кнопка в кнопке?

Что-то я не подумал. Я придумал на ходу, неудачно. Забыл что все дочерние виджеты находятся внутри виджета предка. Дальше именно как я хочу сделать с графическим представлением.

Вариант 1:   Создаю собственный класс. В конструкторе инициализирую конструктор базового класса. В MainWindow  создаю объекты передавая в них предка, и объект без предка удаляю сам.

Код
C++ (Qt)
#include <QGraphicsTextItem>
 
class my_QGraphicsTextItem : public QGraphicsTextItem
{
   Q_OBJECT
 
public:
   explicit my_QGraphicsTextItem(QGraphicsItem *parent = Q_NULLPTR) : QGraphicsTextItem (parent) {}
 
};
 
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0)
           {
 
           QGraphicsScene scene;
 
           my_QGraphicsTextItem *text = new my_QGraphicsTextItem;
           my_QGraphicsTextItem *text2= new my_QGraphicsTextItem(text);
           my_QGraphicsTextItem *text3 = new my_QGraphicsTextItem(text2);
 
           scene.addItem(text );
           scene.addItem(text2 );
           scene.addItem(text3 );
            }
          ~MainWindow()
           { delete text ; }
 
};


Вариант 2:   Создаю собственный класс. В конструкторе инициализирую конструктор базового класса. Но в отличии от предыдущего класса, этот в качестве предка принимает не QGraphicsItem а QGraphicsScene. В MainWindow  создаю объекты передавая в них предка, и так получается у всех есть предок сцена. И ничего удалять не приходится. Сцена создана не динамически.

Код
C++ (Qt)
#include <QGraphicsTextItem>
 
class my_QGraphicsTextItem : public QGraphicsTextItem
{
   Q_OBJECT
 
public:
   explicit my_QGraphicsTextItem(QGraphicsScene *parent = Q_NULLPTR) : QGraphicsTextItem (parent) {}
 
};
 
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0)
           {
 
           QGraphicsScene scene;
 
           my_QGraphicsTextItem *text  = new my_QGraphicsTextItem(&scene);
           my_QGraphicsTextItem *text2 = new my_QGraphicsTextItem(&scene);
           my_QGraphicsTextItem *text3 = new my_QGraphicsTextItem(&scene);
 
           scene.addItem(text );
           scene.addItem(text2 );
           scene.addItem(text3 );
            }
          ~MainWindow();
 
};


Вопрос 1: Какой из этих вариантов лучше сделать?
Вопрос 2: В первом варианте я правильно удалил объект? В программировании немного, еще не приходилось удалять объекты.
33  Qt / Вопросы новичков / Динамическое создание обьектов : Август 08, 2017, 11:02
Вопрос 1: Благодаря системе объектных иерархий с разработчика снимается необходимость самому заботиться об освобождении памяти от созданных объектов.
     Конструктор класса QObject выглядит следующим образом:
    QObject (QObject* pobj = 0);

QObject* pobjl = new QObject;
QObject* pobj2 = new QObject (pobjl) ;
QObject* pobj4 = new QObject (pobj2) ;
QObject* pobj3 = new QObject (pobjl) ;

Однако я не могу понять кто удалит pobjl? Понятно что (pobj2, pobj3, pobj4) удаляться, поскольку у каждого из них есть предок.


Вопрос 2:
QObject (QObject* pobj = 0);
Правильно я понимаю? Такая запись в конструкторе означает, что при динамическом создании объекта, если мы ничего не передадим ему в конструктор, объект будет создан как (объект верхнего уровня).


Вопрос 3:
class My_ComboBox : public QComboBox
{
    Q_OBJECT
public:
    explicit My_ComboBox(QWidget *parent = 0)
    {
        setParent(parent);
     }
}

Нужно ли реализовывать метод setParent(parent);? Кажется что нужно, для того чтобы, когда мы динамически создадим объект этого класса, и в конструктор передадим предка, это метод установит указатель. Может я что-то не так понимаю сори...

Вопрос 4:
QGraphicsScene  scene;

QGraphicsTextltem* textltem = new  QGraphicsTextltem(?)
QGraphicsRectItem *rectItem = new QGraphicsRectItem(textltem)
QGraphicsRectItem *rectItem2 = new QGraphicsRectItem(rectItem2)

Дело в том что, в конструкторы QGraphics____ltem-ов можно передать предок QGraphicsItem, что и происходит с rectItem и rectItem2 . Но что передавать в textltem? Ему тоже нужно передать предка. Можно было бы предать сцену (scene), но textltem не принимает в качестве предка сцену. Кто же тогда удалит textltem?


Вопрос 5:
Простите и последний вопрос.

class My_QToolButton : public QAbstractButton
{
explicit My_QToolButton (QWidget *parent = Q_NULLPTR);

}

Если в конструкторе я поменяю вместо QWidget поставлю (explicit My_QToolButton (QToolButton *parent = Q_NULLPTR)Подмигивающий
Получается в качестве предка кнопка My_QToolButton должна будет получать себе подобный виджет? Это как-то повлияет на поведение виджета или программы? В смысле, небезопасны такие замены? Понятно что, в данном случае сужаются варианты предков, вопрос в том, можно так делать? И что значит Q_NULLPTR?
Страниц: 1 2 [3]

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