Russian Qt Forum
Ноябрь 22, 2024, 17:56
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
Вопрос по реализации
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Вопрос по реализации (Прочитано 5860 раз)
Nidxogg
Гость
Вопрос по реализации
«
:
Сентябрь 17, 2015, 18:36 »
Добрый день
Интересует совет как реализовать нужное поведение, может какой паттерн или все намного проще.
Суть:
Есть Qtприложение с плагинами.
Главная форма MainWindow + QMdiArea в centralWidget. Приложению известен только интерфейс плагинов.
В плагинах реализуются action-ы со слотами, создается меню, которое добавляется в menubar MainWindow. Собственно, результатом срабатывания action-а является создание окна-наследника QWidget.
И вопрос, как вернуть через указатель на это окно после срабатывания action-а, чтобы добавить его к QMdiArea?
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Вопрос по реализации
«
Ответ #1 :
Сентябрь 18, 2015, 10:47 »
Сделать факторизацию через плагин, например, с интерфейсом типа
virtual QWidget* createWidget()
{
...
}
и вызывать этот метод при обработке экшина.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Nidxogg
Гость
Re: Вопрос по реализации
«
Ответ #2 :
Сентябрь 18, 2015, 19:16 »
Цитата: Racheengel от Сентябрь 18, 2015, 10:47
Сделать факторизацию через плагин, например, с интерфейсом типа
virtual QWidget* createWidget()
{
...
}
и вызывать этот метод при обработке экшина.
То что указатель на виджет возвращается через интерфейс - это понятно
Аналогично я возвращаю указатель на меню после загрузки плагина
Вопрос в том, как сообщить MainWindow, что нужно вызвать этот метод, если обработка экшена находится внутри плагина.
И ещё вопрос, как отследить что окно закрылось и удалить его (не используя Qt::WA_DeleteOnClose). Вести какой-то контейнер указателей созданных окон внутри плагина?
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Вопрос по реализации
«
Ответ #3 :
Сентябрь 21, 2015, 11:58 »
Ваш плагин при загрузке должен как-то регистрироваться в приложении.
При регистрации сделайте связь экшена в плагине с методом приложения, которое будет вызывать createWidget().
Как вариант, обычным коннектом слотов-сигналов.
По поводу 2 - можно через QWidget::closeEvent, например.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Nidxogg
Гость
Re: Вопрос по реализации
«
Ответ #4 :
Сентябрь 21, 2015, 18:29 »
Цитировать
Ваш плагин при загрузке должен как-то регистрироваться в приложении.
При регистрации сделайте связь экшена в плагине с методом приложения, которое будет вызывать createWidget().
Как вариант, обычным коннектом слотов-сигналов.
В результате срабатывания каждого экшена создается окно определенного типа (все они наследники одного базового класса)
Я правильно понимаю, что createWidget() будет просто возвращать указатель на уже созданное окно внутри плагина (в результате экшена), а не сообщать плагину что именно надо создать? (Это вообще
законно
нормально?)
Цитировать
По поводу 2 - можно через QWidget::closeEvent, например.
Имеете ввиду переопределить этот метод в MainWindow?
«
Последнее редактирование: Сентябрь 21, 2015, 18:32 от Nidxogg
»
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Вопрос по реализации
«
Ответ #5 :
Сентябрь 22, 2015, 01:30 »
Цитата: Nidxogg от Сентябрь 21, 2015, 18:29
Я правильно понимаю, что createWidget() будет просто возвращать указатель на уже созданное окно внутри плагина (в результате экшена), а не сообщать плагину что именно надо создать? (Это вообще
законно
нормально?)
А какая разница приложению, как именно плагин создает окно? Главное, чтобы тип созданного окна поддерживался приложением, но ведь ваш плагин это и так гарантирует.
Цитировать
По поводу 2 - можно через QWidget::closeEvent, например.
Имеете ввиду переопределить этот метод в MainWindow?
[/quote]
Я так понял, что вам надо, чтобы каждое окно сообщало о своем закрытии? Тогда в окне надо переопределить.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Nidxogg
Гость
Re: Вопрос по реализации
«
Ответ #6 :
Сентябрь 22, 2015, 18:44 »
Цитировать
Я так понял, что вам надо, чтобы каждое окно сообщало о своем закрытии? Тогда в окне надо переопределить.
Для сообщения я и так переопределил closeEvent (чтобы уведомлять о наличии несохраненных изменений)
Надо именно корректно освободить выделенную память при закрытии. Сейчас использую флаг deleteonclose, просто интересуют ещё варианты.
Я так понимаю в closeevent нельзя написать что-то вроде delete this?
Цитировать
А какая разница приложению, как именно плагин создает окно? Главное, чтобы тип созданного окна поддерживался приложением, но ведь ваш плагин это и так гарантирует.
Просто интересуюсь, может быть есть другие варианты
Получается, что в интерфейсе придется объявить виртуальный сигнал, сообщающий слоту в MainWindow, что необходимо запросить виджет? Или подключить сигналы от экшенов из возвращаемого интерфесом меню к слоту?
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Вопрос по реализации
«
Ответ #7 :
Сентябрь 22, 2015, 19:41 »
Цитировать
Я так понимаю в closeevent нельзя написать что-то вроде delete this?
Нельзя.
Цитировать
Сейчас использую флаг deleteonclose, просто интересуют ещё варианты.
Да нормальный, вроде, вариант
Цитировать
Получается, что в интерфейсе придется объявить виртуальный сигнал, сообщающий слоту в MainWindow, что необходимо запросить виджет? Или подключить сигналы от экшенов из возвращаемого интерфесом меню к слоту?
Ну так а разве экшены меню не плагином создаются?
Они же пусть будут подключены к слоту в плагине, который делает окно.
Или их можно делегировать в MainWindow, если необходимо по задаче.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Nidxogg
Гость
Re: Вопрос по реализации
«
Ответ #8 :
Сентябрь 22, 2015, 20:09 »
Цитировать
Ну так а разве экшены меню не плагином создаются?
Они же пусть будут подключены к слоту в плагине, который делает окно.
Все уже так.
Извиняюсь, если непонятно формулирую свои вопросы.
Цитировать
Или их можно делегировать в MainWindow, если необходимо по задаче.
Изначальный вопрос, как сообщить MainWindow, что нужно запросить у плагина окно, которое уже было создано внутри плагина.
Сначала были мысли сигнал в интерфейсе, связанный со слотом в MainWindow. Но мне почему-то такой вариант кажется не очень, какое-то "туда-сюда" получается.
Записан
Nidxogg
Гость
Re: Вопрос по реализации
«
Ответ #9 :
Сентябрь 23, 2015, 15:10 »
Сделал простенькое приложение, чтобы было понятно о чем речь
Проблема все та же, получить из плагина указатель на созданное окно
Даже если прикрутить сигнал в интерфейс, все равно надо как-то узнать, из какого именного плагина он испущен
«
Последнее редактирование: Сентябрь 23, 2015, 15:13 от Nidxogg
»
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Вопрос по реализации
«
Ответ #10 :
Сентябрь 23, 2015, 15:38 »
Тогда можно передать поинтер на MainWindow в функцию Initialize().
После этого плагин будет знать про главное окно и куда вставлять свои окна.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Nidxogg
Гость
Re: Вопрос по реализации
«
Ответ #11 :
Сентябрь 23, 2015, 15:47 »
Цитата: Racheengel от Сентябрь 23, 2015, 15:38
Тогда можно передать поинтер на MainWindow в функцию Initialize().
После этого плагин будет знать про главное окно и куда вставлять свои окна.
Попробую так, спасибо
Просто предлагал, что плагин ничего не должен знать о том, где он вызывается
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...