Russian Qt Forum
Март 28, 2024, 21:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вкладки как в браузерах  (Прочитано 8442 раз)
maksimAstraLin
Гость
« : Август 15, 2017, 12:42 »

Здравствуйте.

Подскажите, пожалуйста, где можно найти информацию, на что следует обратить внимание, какие могут встретиться подводные камни, и вообще, выполнима ли вот такая задача:

В основном окне приложения пользователь будет запускать отдельные процессы-подзадачи. Для каждого процесса должна создаваться вкладка, например, на QTabWidget. Нужно сделать возможным перетаскивание этих вкладок в отдельные окна, между этими окнами и обратно в главное окно подобно тому, как происходит перетаскивание вкладок в браузерах.

Операционная система: Astra Linux
Среда разработки: Qt Creator и Qt Designer.

С уважением, Максим.
Записан
Bepec
Гость
« Ответ #1 : Август 15, 2017, 15:32 »

Возможно, но вам необходим ещё какой-то функционал, подозреваю. Подзадачный. Так что приложения должны поддерживать как минимум общение.
Записан
maksimAstraLin
Гость
« Ответ #2 : Август 15, 2017, 15:43 »

... необходим ещё какой-то функционал, ...

А для того, чтобы вкладки QTabWidget функционировали описанным способом это тоже понадобится, правильно я понял?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #3 : Август 15, 2017, 16:25 »

ну, надо будет иметь возможность поменять контроллера процесса, чтобы он общался с другой вкладкой (в другом приложении) и не умирал, когда умрет тот, кто его создал изначально.
Записан
maksimAstraLin
Гость
« Ответ #4 : Август 15, 2017, 16:32 »

... поменять контроллера процесса, ...

Буду признателен, если подскажете, где об этом можно почитать.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #5 : Август 15, 2017, 16:42 »

Сперва, нужно организовать межпроцессное взаимодейстие. Либо сокеты, либо пайп, либо unix-сигналы. Обычно первое юзают, насколько мне известно.
Чтобы процесс не умирал, надо погуглить - либо можно запускать его демоном сразу (тогда парент процесса - демон и пофиг в какой он вкладке), либо менять парента. Что для венды, яхз, никогда не писал процессы в венде.
Записан
maksimAstraLin
Гость
« Ответ #6 : Август 15, 2017, 16:48 »

Благодарю. Начну углублять знания по сокетам и демонам.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #7 : Август 15, 2017, 17:11 »

ну поменять парента кажется проще)
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Август 29, 2017, 13:26 »

А никто не пробовал код какого-нибудь из браузеров "препарировать" для изъятия из него подобного функционала?
Записан
Bepec
Гость
« Ответ #9 : Август 29, 2017, 14:05 »

Это всё щедро приправлено всем навесным функционалом. И для отделения зёрен от плевел придётся придётся изучать весь проект целиком Веселый Слишком большая работа для столь простого вопроса Подмигивающий
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #10 : Август 29, 2017, 14:21 »

Это всё щедро приправлено всем навесным функционалом. И для отделения зёрен от плевел придётся придётся изучать весь проект целиком Веселый Слишком большая работа для столь простого вопроса Подмигивающий
ИМХО, браузер просто создает новый процесс и перебрасывает в него загруженные данные.
Записан
Bepec
Гость
« Ответ #11 : Август 30, 2017, 00:57 »

Угу. Перебрасывает. Но при этом оставляет возможность изменения, доступа и модификации этих данных из основного приложения Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #12 : Август 30, 2017, 13:29 »

В разных браузерах по-разному. Например, сафари создает один процесс на весь веб-контент, а хром - на каждую вкладку.
Записан
maksimAstraLin
Гость
« Ответ #13 : Сентябрь 13, 2017, 08:58 »

Всем доброго дня!

С процессами пока не разобрался, но вот что получилось сделать со вкладками:

Я создал наследника QApplication. В нем - контейнер указателей на все создаваемые окна программы и слот создания нового окна. В этом наследнике я установил eventFilter на this. В классе основного окна я установил eventFilter на объект QTabBar моего QTabWidget.
Когда MainWindow понимает, что пора начинать перетаскивание, создается объект перетаскивания, посредством сигнала наследнику QApplication передается указатель на виджет вкладки и ее название и далее запускается перетаскивание: (QDrag*) drag->exec(Qt::MoveAction).
В MainWindow::dropEvent() обрабатывается отпускание на другую вкладку и на виджет открытой вкладки (в этом случае перетаскиваемая вкладка возвращается в QTabWidget). Если пользователь бросил вкладку в любое другое место окна - срабатывает сигнал создания нового окна.
Наследник QApplication отслеживает событие перетаскивания вкладки на пространство, свободное от окон программы. Если пользователь бросит вкладку во вне, сработает событие QEvent::ChildRemoved и будет выдан сигнал создания нового окна.
Каждый раз при создании нового окна вызывается сигнал для закрытия окон, в которых не осталось вкладок: соответствующий слот перебирает контейнер окон, закрывает нужные окна и убирает указатель из контейнера.
Память при закрытии окна освобождается, благодаря атрибуту:
(MainWindow*) this->setAttribute(Qt::WA_DeleteOnClose).
Слот создания окна принимает два параметра: указатель на видежт вкладки и название вкладки. Он создает окно (такое же, как главное), добавляет указатель на него в контейнер, создает вкладку с указанными виджетом и названием и отображает окно.

PS: Допускаю, что, когда я разберусь с процессами, этот алгоритм работы придется переделать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.