Добавление виджетов Qt в MainWindow во время выполнения
Вот моя ситуация:
Я занимаюсь разработкой приложения на C++ в Creator/Designer с Qt 5.6 для Windows 7 64-bit
Я разрабатываю каркасный графический интерфейс, который сам по себе мало что делает. Он в основном предоставляет механизм для интеграции инженерных инструментов, созданных другими разработчиками (если хотите, плагинами, не путайте плагины с самим Qt). Скелет будет установлен на рабочих станциях по всему офису, и он сможет вытащить эти плагины из сетевого расположения и установить их на скелет без перекомпиляции. При запуске скелет должен прочитать свой список плагинов и соответственно построить меню, панели инструментов и виджеты пользовательского интерфейса.
Итак, в конечном итоге вопрос заключается в следующем: предоставляет ли Qt способ добавления файлов.ui и связанного с ним кода в QMainWindow во время выполнения?
Может ли он сделать это таким образом, чтобы скелет не нужно было менять, перекомпилировать и повторно развертывать при создании новых плагинов?
Близко, но без сигары: Вот пример пользовательского интерфейса калькулятора, созданного в Designer, динамически загружаемого в другую программу, но, похоже, этот метод использует только файл.ui. Другими словами, поля и кнопки извлекаются из файла.ui, но его логика реализована в "скелете". Мне нужно сделать что-то похожее на встраивание калькулятора как его собственного полнофункционального виджета во время выполнения.
Дополнительный вопрос: Если Qt не предоставляет хороший механизм, есть ли недостатки в том, что другие разработчики компилируют свои подключаемые модули как библиотеки DLL для моего конкретного случая?
1 ответ
Существует некоторое недопонимание того, что делает приложение Qt. Каждый виджет, который вы видите, создается путем выполнения кода C++ - все это делается динамически, во время выполнения. UIC занимает foo.ui
файл и превращает его в ui_foo.h
, Это определяет класс, который может заполнять базовый виджет детьми.
Вы можете использовать QUiLoader
разобрать .ui
создавать и создавать экземпляры своих объектов во время выполнения, но делать это бессмысленно, так как другой код все еще C++, поэтому проще всего иметь проект плагина, который конвертирует .ui
файлы в C++, затем компилирует их вместе с другим вашим кодом и связывает их в плагин dll.
Плагины просто .dll
s, в идеале обеспечивающие функциональные возможности, используемые системой плагинов Qt, которые имеют весь необходимый код: код, полученный из .ui
файлы через uic, и код, который авторы плагина написали от руки. Плагин - это объектная фабрика: он создаст QObject
экземпляры, которые затем могут предоставить вашему скелету все виджеты и другие необходимые ему объекты.
Это все. Плагины .dll
s, и вы, конечно, можете свободно загружать их из сетевого расположения в папку кэша и открывать их во время выполнения.
Нет никакой разницы между плагинами "для самого Qt" и плагинами для вашего приложения: Qt - это код C++, так же как и ваше приложение. Хотя он может потреблять функциональность некоторых плагинов, остальные предназначены для вашего кода.
Для вдохновения вы должны взглянуть на источники самого Qt Creator. Это полностью основанное на плагинах приложение, ядро - контейнер плагинов, который мало что делает. Возможно, вы могли бы повторно использовать ядро Qt Creator в качестве основы для вашего приложения, либо без изменений, либо с минимальными изменениями. Он будет поставляться с плагином для обнаружения сети, который получает остальные плагины с сервера в кэш, а затем загружает их. Такой плагин может быть написан в 150 строках кода, исключая минимальный шаблон:)