Название: Вызвать конструктор наследника. Отправлено: Alex_C от Апрель 20, 2012, 10:47 Есть много окон, наследуемых от одного базового класса AbstractWindow.
При вызове соответствующего QAction происходит открытие или закрытие соответствующего окна Код: void MainForm::showCalculator() где calcWindow - как раз одно из этих окон, наследник AbstractWindow. Получается что такую ф-цию нужно писать для каждого открываемого окна. Вопрос - а можно сделать что-то типа Код: void MainForm::showCalculator(AbstractWindow w) Название: Re: Вызвать конструктор наследника. Отправлено: Igors от Апрель 20, 2012, 11:06 Код: void MainForm::showCalculator(AbstractWindow w) Название: Re: Вызвать конструктор наследника. Отправлено: alexis031182 от Апрель 20, 2012, 11:13 Можно через фабрику (QMetaType), правда понадобится имя класса в виде строки.
Код: AbstractWindow *MainForm::instance(const QString &win_name) Название: Re: Вызвать конструктор наследника. Отправлено: V1KT0P от Апрель 20, 2012, 11:15 Код: void MainForm::showCalculator(AbstractWindow w) Название: Re: Вызвать конструктор наследника. Отправлено: Alex_C от Апрель 20, 2012, 14:56 Ок! Направление деятельности ясно.
Теперь вопрос : как зарегистрировать класс, с конструктором CalcWindow(QAction *a, QSettings *s, bool isModal, QWidget *parent) Делаю так - выдает ошибку. Код: Q_DECLARE_METATYPE(CalcWindow(QAction *a, QSettings *s, bool isModal, QWidget *parent)) Название: Re: Вызвать конструктор наследника. Отправлено: Alex_C от Апрель 20, 2012, 14:58 Вообще как я понимаю, самый простой вариант через QAction->setData, но для этого нужно свои классы окон через Q_DECLARE_METATYPE зарегистрировать.
Название: Re: Вызвать конструктор наследника. Отправлено: alexis031182 от Апрель 20, 2012, 15:00 Ок! Направление деятельности ясно. С таким конструктором этого не сделать. Должен быть т.н. конструктор по умолчанию (т.е. без параметров, либо с параметрами, имеющими значения по умолчанию). Это по сути всплывает проблема, которая обсуждалась в другой теме (по поводу получения имени класса в конструкторе).Теперь вопрос : как зарегистрировать класс, с конструктором ... Название: Re: Вызвать конструктор наследника. Отправлено: Alex_C от Апрель 20, 2012, 15:01 Единственное что у меня классы окон определены как
Код: QPointer<CalcWindow> calcWindow; как только их через QAction->setData() передавать... Название: Re: Вызвать конструктор наследника. Отправлено: Alex_C от Апрель 20, 2012, 15:04 Должен быть т.н. конструктор по умолчанию (т.е. без параметров, либо с параметрами, имеющими значения по умолчанию). Это по сути всплывает проблема, которая обсуждалась в другой теме (по поводу получения имени класса в конструкторе). Мда. В таком случае получается так сделать нельзя. Конструктор по умолчанию мне не подходит. Название: Re: Вызвать конструктор наследника. Отправлено: alexis031182 от Апрель 20, 2012, 15:08 Мда. В таком случае получается так сделать нельзя. Конструктор по умолчанию мне не подходит. Сами себе закрыли доступ к этому функционалу.Название: Re: Вызвать конструктор наследника. Отправлено: Alex_C от Апрель 20, 2012, 15:29 Хорошо, а вот такой вариант
Код: typedef void (*ShowFunc)(void); И создавать-восстанавливать вид окон так Код: QAction *w1 = createActionForWindows("Calculator", showCalculator); Вот такой вариант? Да, для каждого окна ф-ция showCalculator - будет своя, но в принципе пока так сойдет. Единственное что: 1. Вызов createActionForWindows("Calculator", showCalculator); - выдает ошибку. 2. А так прокатит: Код: QAction* MainForm::createActionForWindows(QString winName, ShowFunc f) Название: Re: Вызвать конструктор наследника. Отправлено: mutineer от Апрель 20, 2012, 15:33 2. А так прокатит: Код: QAction* MainForm::createActionForWindows(QString winName, ShowFunc f) нет, это не сработает - SLOT преобразовывает полученное в строку, а получит он "f" Название: Re: Вызвать конструктор наследника. Отправлено: Igors от Апрель 20, 2012, 15:59 Вообще как я понимаю, самый простой вариант через QAction->setData, но для этого нужно свои классы окон через Q_DECLARE_METATYPE зарегистрировать. Вам нужно просто "новое окно", а не сериализация, поэтому Q_DECLARE_METATYPE здесь не нужен. Сделайте скромную ф-цию типаКод И в QAction запишите просто ID. Не переживайте что это "не совсем круто/грамотно". Так или иначе такая конструкция неизбежна. Название: Re: Вызвать конструктор наследника. Отправлено: Alex_C от Апрель 20, 2012, 21:43 Всем большое спасибо за советы - очень помогают в освоении Qt!
Целый день прикидывал и так, и так. В результате пришел к выводам некоторым. Открываю сайт - спасибо Igors за невольную поддержку! :) Совершенно с Вами согласен - вроде как хочется "круто/грамотно", но это не должно все же идти в разрез здравой логики. Думаю, то, что Вы предложили - самое и простое, и верное. Во всяком случае других, более простых и правильных вариантов по моему нет. P.S. Однако много интересного про QMetaType прочел - тема была поднята не даром :) Название: Re: Вызвать конструктор наследника. Отправлено: Alex_C от Апрель 21, 2012, 08:09 Нашел весьма хорошее решение своей проблемы. Приведу его тут - может кому пригодится.
showWindow - это SLOT, вызываемый при клике на меню открытия окна Код: void MainForm::showWindow() Название: Re: Вызвать конструктор наследника. Отправлено: Igors от Апрель 21, 2012, 11:48 Возможен и другой подход: сразу создать нужные окна и потом оперировать show/hide
Код
|