Название: Вкладки как в браузерах Отправлено: maksimAstraLin от Август 15, 2017, 12:42 Здравствуйте.
Подскажите, пожалуйста, где можно найти информацию, на что следует обратить внимание, какие могут встретиться подводные камни, и вообще, выполнима ли вот такая задача: В основном окне приложения пользователь будет запускать отдельные процессы-подзадачи. Для каждого процесса должна создаваться вкладка, например, на QTabWidget. Нужно сделать возможным перетаскивание этих вкладок в отдельные окна, между этими окнами и обратно в главное окно подобно тому, как происходит перетаскивание вкладок в браузерах. Операционная система: Astra Linux Среда разработки: Qt Creator и Qt Designer. С уважением, Максим. Название: Re: Вкладки как в браузерах Отправлено: Bepec от Август 15, 2017, 15:32 Возможно, но вам необходим ещё какой-то функционал, подозреваю. Подзадачный. Так что приложения должны поддерживать как минимум общение.
Название: Re: Вкладки как в браузерах Отправлено: maksimAstraLin от Август 15, 2017, 15:43 ... необходим ещё какой-то функционал, ... А для того, чтобы вкладки QTabWidget функционировали описанным способом это тоже понадобится, правильно я понял? Название: Re: Вкладки как в браузерах Отправлено: Авварон от Август 15, 2017, 16:25 ну, надо будет иметь возможность поменять контроллера процесса, чтобы он общался с другой вкладкой (в другом приложении) и не умирал, когда умрет тот, кто его создал изначально.
Название: Re: Вкладки как в браузерах Отправлено: maksimAstraLin от Август 15, 2017, 16:32 ... поменять контроллера процесса, ... Буду признателен, если подскажете, где об этом можно почитать. Название: Re: Вкладки как в браузерах Отправлено: Авварон от Август 15, 2017, 16:42 Сперва, нужно организовать межпроцессное взаимодейстие. Либо сокеты, либо пайп, либо unix-сигналы. Обычно первое юзают, насколько мне известно.
Чтобы процесс не умирал, надо погуглить - либо можно запускать его демоном сразу (тогда парент процесса - демон и пофиг в какой он вкладке), либо менять парента. Что для венды, яхз, никогда не писал процессы в венде. Название: Re: Вкладки как в браузерах Отправлено: maksimAstraLin от Август 15, 2017, 16:48 Благодарю. Начну углублять знания по сокетам и демонам.
Название: Re: Вкладки как в браузерах Отправлено: Авварон от Август 15, 2017, 17:11 ну поменять парента кажется проще)
Название: Re: Вкладки как в браузерах Отправлено: xokc от Август 29, 2017, 13:26 А никто не пробовал код какого-нибудь из браузеров "препарировать" для изъятия из него подобного функционала?
Название: Re: Вкладки как в браузерах Отправлено: Bepec от Август 29, 2017, 14:05 Это всё щедро приправлено всем навесным функционалом. И для отделения зёрен от плевел придётся придётся изучать весь проект целиком :D Слишком большая работа для столь простого вопроса ;)
Название: Re: Вкладки как в браузерах Отправлено: deMax от Август 29, 2017, 14:21 Это всё щедро приправлено всем навесным функционалом. И для отделения зёрен от плевел придётся придётся изучать весь проект целиком :D Слишком большая работа для столь простого вопроса ;) ИМХО, браузер просто создает новый процесс и перебрасывает в него загруженные данные.Название: Re: Вкладки как в браузерах Отправлено: Bepec от Август 30, 2017, 00:57 Угу. Перебрасывает. Но при этом оставляет возможность изменения, доступа и модификации этих данных из основного приложения :)
Название: Re: Вкладки как в браузерах Отправлено: Авварон от Август 30, 2017, 13:29 В разных браузерах по-разному. Например, сафари создает один процесс на весь веб-контент, а хром - на каждую вкладку.
Название: Re: Вкладки как в браузерах Отправлено: maksimAstraLin от Сентябрь 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: Допускаю, что, когда я разберусь с процессами, этот алгоритм работы придется переделать. |