[РЕШЕНО] Qt. Изменение родительского поведения QWidget (Преобразование в другой класс формы верхнего уровня)

Модератор: Модераторы разделов

vipermagi
Сообщения: 83
ОС: AgiliaLinux

[РЕШЕНО] Qt. Изменение родительского поведения QWidget

Сообщение vipermagi »

Создаю в креаторе формы главных рабочих окон унаследованные от QWidget и могу изменять поведение конкретного наследника. Но как сделать, чтобы можно было создать класс унаследованный от QWidget не через Ui, а потом от него создавать Ui формы разные с возможностью менять их общее поведение в этом не-ui родительском классе?

Иными словами: почему такое можно для виджетов с родителем, а для виджетов верхнего уровня (parent = 0) - нет? И как быть?
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: [РЕШЕНО] Qt. Изменение родительского поведения QWidget

Сообщение Женя Подсыпальников »

vipermagi писал(а):
02.02.2014 22:43
Но как сделать, чтобы можно было создать класс унаследованный от QWidget не через Ui,

Не смог понять вопроса :)

Вы хотите поиметь промежуток с общим поведением ?

Код: Выделить всё

class QMyBehavior
{
public:
  QMyBehavior();
  ~QMyBehavior()

  // Begin of the behavior Interface
  // ..
};

// Abstract layer for the future frames
class QMyMainFrame : public QWidget, public QMyBehavior
{
public:
  virtual ~QMyMainFrame() = 0;

  // ..
};

class QFirstFrame : public QMyMainFrame
{
public:
  //..
};
Пойдём на рыбалку !
Спасибо сказали:
vipermagi
Сообщения: 83
ОС: AgiliaLinux

Re: [РЕШЕНО] Qt. Изменение родительского поведения QWidget

Сообщение vipermagi »

"Через Ui", всмысле через редактор форм и креатор. Т.е.: ПКМ на проекте, Добавить новый, Qt, Класс формы Qt Designer, Выбрать; далее происходит Выбор шаблона формы, в котором собственно и выбирается класс, от которого будет идти наследование, в данном случае это QWidget. Так вот мне хотелось, чтобы это был не QWidget встроеный, а мой класс, который я без формы простым классом отнаследовал от этого же QWidget. Зачем? Чтобы менять поведение QWidget в наследнике для группы оконных классов вместо того, чтобы менять в каждом оконном классе одно и тоже несколько раз, и при этом пользоваться благами дизайнера форм как ни в чём не бывало.

В общем решение пришло сегодня. Щас только доперепилил свои костыли, всё заработало. Просто и красиво :) Полиморфизм решает.

Отнаследовал Widget от QWidget без дизайнера форм. Потом отнаследовал MyWdiget от QWidget с дизайнером форм. Затем залез в mywidget.h и заменил include <QWidget> на include "widget.h" и соответственно заменил все упоминания QWidget на Widget. Потом здесь же сделал ссылку QWidget *self;
Потом открыл mywidget.cpp и поменял все QWidget на Widget. За тем в список инициации конструктора добавил self(this), ну и в тело конструктора добавил ui->setupUi(self);
Теперь я могу воплощать изменения поведения QWidget для всех классов окон, которые таким же образом отнаследованы.

Результат:

myclass.h

Код: Выделить всё

#ifndef MYCLASS_H
#define MYCLASS_H

#include "widget.h" //здесь был QWidget и везде, где щас стоит Widget он тоже был

namespace Ui {
class MyClass;
}

class MyClass : public Widget
{
    Q_OBJECT

public:
    explicit MyClass(Widget *parent = 0);
    ~MyClass();

private:
    Ui::MyClass *ui;
    QWidget *self; //полиморфный указатель на this; теперь ui хочет кушать его только в таком виде; а инклуд <QWieget> остался в widget.h
};

#endif // MYCLASS_H


и

myclass.cpp

Код: Выделить всё

#include "myclass.h"
#include "ui_myclass.h"

MyClass::MyClass(Widget *parent) :
    Widget(parent),
    ui(new Ui::MyClass),
    self(this)
{
    ui->setupUi(self);
}

MyClass::~MyClass()
{
    delete ui;
}


UPD
Всё даже ещё проще. Полиморфный указатель не нужен. В изначальном варианте this ведь тоже не полиморфный, и ui_myclass.h работает с тем же базовым QWidget и сам создаёт этот указатель: void setupUi(QWidget *MyClass). Я вроде делал пытался делать так раньше, не смотря в ui_myclass.h, но не заработало почему-то.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [РЕШЕНО] Qt. Изменение родительского поведения QWidget

Сообщение NickLion »

А в дизайнере форм promote — не то, что Вы хотели?
Спасибо сказали:
vipermagi
Сообщения: 83
ОС: AgiliaLinux

Re: [РЕШЕНО] Qt. Изменение родительского поведения QWidget

Сообщение vipermagi »

NickLion писал(а):
21.02.2014 21:25
А в дизайнере форм promote — не то, что Вы хотели?


Нет, это написано в последней строчке первого сообщения: promote не работает из-за (parent = 0), ибо таков механизм.
Спасибо сказали: