2009-07-26 2 views
2

Есть ли способ открыть процесс Qt, а затем программно добавить виджеты? Например, запустите процесс, который открывает кадр, а затем, с другим вызовом, скажем, с другой программой (это мой, на самом деле другой язык сценариев), добавьте кнопку в этот кадр?Динамически манипулировать Qt GUI

Итак, в другой программе я говорю «открыть фрейм» в строке и открывается рамка. И затем я говорю «добавить кнопку», и только что открывшийся фрейм заполняется кнопкой.

Обновлено для комментариев. Обновлено, чтобы добавить пример.

+0

Ребенка процесс не ваш, не так ли? (поэтому он не может быть разработан для задачи) – Eugene

ответ

0

Эта функциональность не встроена в приложения Qt (или любое другое Fraemwork AFAIK), но вы можете создать ее самостоятельно, если вы создаете обе программы.

+0

Приятно слышать, что это возможно - спасибо! – Jeff

0

Лучший способ начать работу с использованием QSharedMemory для доступа к одной и той же памяти в обоих процессах, а затем то, что вы описываете, должно быть совершенно возможным.

+0

Я вижу пример @ http://doc.trolltech.com/main-snapshot/ipc-sharedmemory.html, и это имеет смысл для загружаемых в память вещей, но как насчет звонков? Итак, на другом языке, я делаю, что говорю «open frame» на своем языке сценариев, и рамка открывается. И затем я говорю «добавить кнопку», и только что открывшийся фрейм заполняется кнопкой. Это похоже на правильный трек, хотя .... – Jeff

+0

И спасибо за ответ - поздравляю с недавним участием. – Jeff

+1

Вам просто нужно указать правильный адрес указателю. В этом случае вы можете указать адрес в QFrame, а затем вы можете вызывать функции на нем. Вы должны быть осторожны с распределением, чтобы обеспечить выделение в общую память. –

0

Если вы можете сделать другое приложение библиотекой dll/shared, загружаемой основным приложением.
Тогда просто попробуйте меню рисования метода или рисовать рамку в dll. Основное приложение проверяет наличие DLL и загружает его, затем оно может проверить, существует ли метод gui - это обычный способ реализации плагинов gui.

0

Самый простой способ - выставить набор функций из основной программы (той, которая рисует) и загрузить их из «клиента» и просто вызвать их, когда вам нужно.

Другим подходом, требующим дополнительной работы, является использование какой-либо межпроцессной связи (например, разделяемая память, сокеты, d-шина и т. Д. Для реализаций вы можете использовать те, которые предлагает Qt, или):

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

+0

После настройки IPC просмотрите QUILoader (http://doc.qtsoftware.com/4.5/quiloader.html). Он может загружать файлы .ui на лету, что упрощает добавление нового пользовательского интерфейса в запущенную программу. – Eugene

1

Как уже было указано, это возможно. Если вам нужен язык сценариев для конкретного домена, я бы рекомендовал использовать QtScript module. Он основан на ECMAScript 262 и обеспечивает доступ к сигналам, слотам и прочим вещам.

Хотя вы можете использовать IPC или TCP для управления приложением, Qxt предоставляет QxtRPCPeer, который может использоваться для подключения сигналов и слотов между приложениями, подключенными через QIODevice, например, TCP или локальным соединением.

+0

+1 для QxtRPCPeer, который действительно изящный. – Macke