Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: D_N_S от Декабрь 06, 2005, 12:59



Название: Переопределение базового класса UI-диалога
Отправлено: D_N_S от Декабрь 06, 2005, 12:59
Есть следующая задача.
Все диалоги для ввода данных вызываются из главного диалога однотипно: им передаются одни и те же (их тип, а не значение ест-но) параметры, возвращаются одни и те же у всех.
Нужно для всех них поиметь общий базовый класс, чтобы из главной формы вызывать их не смотря на их суть.

Все диалоги генерятся QtDизигнером.

Придумал два подхода на решение этой задачи.
1. Множественное наследование в impl-классах дилога, но сейчас не о нем.
2. Подмена базового класса в UI-ке... в её XML-коде. Этот базовый класс наследуется от QDialog-а + в нем свой небольшой общий для всех потомков функционал унификации передачи параметров в диалоги.

Поначалу второй способ мне казался красивее...
Итак подменил я заголовок в УИшке на следующий
Код:
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
<class>LocUserEdForm</class>
<includes>
<include location="local" impldecl="in declaration">qbaseeddlg.h</include>
</includes>
<widget class="QBaseEdDlg">

Класс QBaseEdDlg имеет только конструктор и деструктор. Проект скомпилился запустился. Добавил int член класса в QBaseEdDlg и проект после компиляции стал падать во время создания этих универсальных диалогов, падал по причине Segmentation Fault.
Что за хрень? Почему? чем ему не понравились этот интовый безобидный член класса?

Заранее спасибо за советы!

P.S. Кроме того UI-шка с таким подмененным базовым классом перестала редактироваться QtDезигнером. :(


Название: Переопределение базового класса UI-диалога
Отправлено: Racheengel от Декабрь 06, 2005, 13:29
в 3.3.х дезигнер глюкавый под винду, он не все файлы нормально открывает...


Название: Переопределение базового класса UI-диалога
Отправлено: D_N_S от Декабрь 06, 2005, 13:43
Виноват, забыл - в данном случае всё рассматривается во FreeBSD, Kdevelop-е и qt3.3.4.


Название: Переопределение базового класса UI-диалога
Отправлено: Dendy от Декабрь 06, 2005, 14:25
Попробую сходу предложить вариант.

Как на счёт заюзать property? В дизайнере создаёшь диалоги, которьlе наследуются от QDialog. В каждой же реализации диалога создаёшь параметр для инициализации и получения результатов.

Устанавливаешь данньlе из базового класса QDialog::setProperty(), получаешь через QDialog::property().

P.S. Не стоит править UI руцями


Название: Переопределение базового класса UI-диалога
Отправлено: Saint от Декабрь 06, 2005, 15:50
А зачем такие сложности? Чем плохо множественное наследование? По-мойму это тот для чего оно и придуманно...


Название: Переопределение базового класса UI-диалога
Отправлено: D_N_S от Декабрь 06, 2005, 17:59
Dendy, дело говоришь! QT - снова рулит )) Тока уже поздно: сделал через множественное наследование, заодно хоть раз его на практике попробовал (+ мало ли какой общий функционал появится у диалогов) :) а то всё не на чем было )))

Saint, Dendy, Racheengel, спасиб еще раз!


Название: Переопределение базового класса UI-диалога
Отправлено: Dendy от Декабрь 09, 2005, 19:43
Цитата: "Saint"
А зачем такие сложности? Чем плохо множественное наследование? По-мойму это тот для чего оно и придуманно...


Согласен, с проперти паскудньlй способ!  :D  Но способ как вариант. Его наличие уже греет душу.

А вообще правильно смотреть в сторону Custom Widgets:
http://doc.trolltech.com/4.1/designer-using-custom-widgets.html


Название: пАдстава
Отправлено: D_N_S от Декабрь 12, 2005, 21:36
Цитата: "Saint"
А зачем такие сложности? Чем плохо множественное наследование? По-мойму это тот для чего оно и придуманно...

Работало оно себе множественное наследование, работало... перешел назад из freeBSD-ы в Win - появились критические ошибки :( Вычислил кто виноват - оказалось разное функционирование множественного наследования опосля микрософтного компилятора.
Так что "что g++ хорошо, то cl - смерть".
Надоели эти приколы - сделал по рабоче-крестьянски (через property).

Эээээх... кроссплатформенность... то popup-ы не передают id свой в activated (вин->фрибсд), то множественное наследование разродилось по новому (фирбсд->вин).

Пускай теперь не так лаконично и красиво - зато везде работает )


Название: Переопределение базового класса UI-диалога
Отправлено: Dendy от Декабрь 13, 2005, 12:45
Уже сгораю от стьlда... Насоветовал, ьопт :)  Вот так всегда.

Сам придерживаюсь мультика: Лучше день бежать, зато потом за 5 минут долететь!

 :D