Создаю в креаторе формы главных рабочих окон унаследованные от QWidget и могу изменять поведение конкретного наследника. Но как сделать, чтобы можно было создать класс унаследованный от QWidget не через Ui, а потом от него создавать Ui формы разные с возможностью менять их общее поведение в этом не-ui родительском классе?
Иными словами: почему такое можно для виджетов с родителем, а для виджетов верхнего уровня (parent = 0) - нет? И как быть?
[РЕШЕНО] Qt. Изменение родительского поведения QWidget (Преобразование в другой класс формы верхнего уровня)
Модератор: Модераторы разделов
-
vipermagi
- Сообщения: 83
- ОС: AgiliaLinux
-
Женя Подсыпальников
- Сообщения: 482
Re: [РЕШЕНО] Qt. Изменение родительского поведения QWidget
Не смог понять вопроса
Вы хотите поиметь промежуток с общим поведением ?
Код: Выделить всё
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
"Через 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
и
myclass.cpp
UPD
Всё даже ещё проще. Полиморфный указатель не нужен. В изначальном варианте this ведь тоже не полиморфный, и ui_myclass.h работает с тем же базовым QWidget и сам создаёт этот указатель: void setupUi(QWidget *MyClass). Я вроде делал пытался делать так раньше, не смотря в ui_myclass.h, но не заработало почему-то.
В общем решение пришло сегодня. Щас только доперепилил свои костыли, всё заработало. Просто и красиво
Отнаследовал 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
А в дизайнере форм promote — не то, что Вы хотели?
-
vipermagi
- Сообщения: 83
- ОС: AgiliaLinux