Как создать и использовать плагины пользовательских виджетов Qt 5.14.0 с MSV C 2019? - PullRequest
0 голосов
/ 21 января 2020

Я наконец решил эту забавную загадку, поэтому я отвечу на свой вопрос. Однако это сводило меня с ума, поэтому, думаю, это может помочь нескольким коллегам-программистам.

Определение проблемы

То, что я хочу сделать, кажется довольно простым: создать свой собственный виджет и интегрировать его в свой собственный Qt Creator (версия, которая работает на моем локальном компьютере, поставляется со стандартной установкой Qt), чтобы я мог свободно использовать его для разработки своих собственных интерфейсов с помощью средства разработки ad ho c GUI.

Продвижение обобщенного c QWidget работает адекватно, это просто не очень удобно.
Я думал, что вижу виджет в инструменте дизайна GUI (вместо невидимого прямоугольника) и было бы неплохо изменить определенные свойства c (вместо того, чтобы делать это программно).
К сожалению, это не go так гладко, как я надеялся.

Я даже не могу будь ответственным за мой собственный компилятор!

Использование:

  • чистая Win 10 в только что переформатированной системе, без каких-либо предыдущих компиляторов, установленных вообще
  • текущая версия Qt v5.14.0 по умолчанию (MinGW и MSVC2017 цели), загруженный стандартным установщиком Qt.

Я начал с наивной компиляции примера (виджет clock ) для x64. Ничего не случилось. Потом х86. Тот же результат или его отсутствие.
Я на самом деле понял, что это было концептуально неправильно перед попыткой скомпилировать его для MinGW.
Очевидно, что созданная DLL должна соответствовать собственному формату фактического Qt Creator, поэтому эта идея make-файла волшебным образом добавление плагина к текущему двоичному файлу Qt Creator - это все, что мне нужно. sh.
Я отбросил желаемую мысль и решил вручную поставить соответствующий бит DLL на свое место.

Это куда я заблудился навсегда.

Вскоре я увидел, что исполняемый файл Qt Creator, поставляемый с Qt 5.14.0, скомпилирован с MSVC2017 в режиме win32 (это указано в окне «about», хотя точной версии нет) о компиляторе и / или цепочке инструментов четко указано, только этот довольно ненадежный «MSVC2017», который также используется для обозначения фактической среды MSVC2019).

Путь, определенный в примере проекта, привел к некоторому crypti c Поддерево MSVC2017, где вообще ничего не произошло.
Помещение туда DLL не имело никакого эффекта. Удаление тех, которые уже присутствовали, также не имело никакого эффекта.
Очевидно, что моя версия Qt Creator никогда не использовала ни одну из этих DLL. Я понятия не имею, для чего они предназначены, и, честно говоря, мне было все равно. Это был просто еще один холодный след, который потратил немного больше моего времени.

Глядя на окно "about plugins .." из Qt Creator, я заметил, что все перечисленные там плагины находятся в <Qt install root>\Qt\Tools\QtCreator\lib\qtcreator\plugins\ (как указано в windows, которое открывается при нажатии кнопки «Подробнее»). Я ошибочно предположил, что все плагины должны были go. Однако помещение результата стандартного примера (симпатичного маленького виджета часов) в этот каталог ничего не дало.

Затем я потерял целый день, пытаясь понять, почему в чертах этот кровавый плагин не показывался .

Поскольку текущая интеграция MSV C несколько странна (Qt все еще ссылается на MSVC2017 при использовании бинарно-совместимого MSVC2019), я решил попробовать использовать набор инструментов Microsoft v14.16 (последний использовал MSVC2017 который может быть установлен с помощью веб-установщика).

Мне никогда не удавалось заставить эту кровавую старую версию набора инструментов работать.
Честно говоря, эта интеграция с Qt / VS является непростой задачей. Он сводится к вызову этого ужасного командного файла "vcvarsall.bat", который устанавливает загрузку переменных среды crypti c. Как это происходит, vcvarsall.bat требует дополнительного аргумента командной строки (-vcvars_ver=14.16), который Qt не может передать (вместо этого он считает определение компилятора недействительным ...) Какая гнилая удача ...).
Вы все еще можете заключить вызов в еще один пакетный файл (@vcvarsall.bat %* -vcvars_ver=14.16) и передать его в настройку компилятора Qt. Но даже тогда я так и не смог собрать эту чертову штуку с компиляцией.
Мне не хватало включений и прочего. Ясно, что в среде IDE должны быть сделаны некоторые другие предположения о том, какие местоположения файлов делают невозможным работу за пределами «автоматически определяемых» версий MSV C (а именно текущей версии MSVC2019 в нынешнем состоянии).

I после всей этой мучительной траты времени я сильно разозлился, поэтому я снова начал просматривать форумы Qt и был захламлен бесчисленными (в основном Linux) обсуждениями путей и опций компилятора. Больше времени потеряно. На самом деле, много времени.

В последней отчаянной попытке я использовал изящный проводник процессов (верно, следящий за всеми ресурсами, открытыми исполняемым файлом), чтобы найти библиотеки DLL, используемые моей работающей копией Qt Creator. Тогда я наконец нашел каталог go [beep] mn.

С этого момента все прошло довольно гладко. Просто скомпилируйте свою маленькую DLL и поместите ее в нужное место, и Боб станет вашим дядей.

1 Ответ

0 голосов
/ 21 января 2020

Немного дерьмовых знаний

Есть две информации, которые могут заставить вас думать, что плагины дизайнера живут либо в Qt\Tools\QtCreator\lib\qtcreator\plugins (путь, сообщаемый окном "О плагинах ..."), либо Qt/5.14.0/msvc2017/plugins/designer (путь установки crypti c, используемый в примере проекта)

И то, и другое неверно и вводит в заблуждение.

Еще один кусочек знания делает вид, что для исполняемого файла Qt Creator требуется точно такая же версия компилятор для создания совместимых плагинов.

Это еще одна фигня. Вы можете очень хорошо скомпилировать с MSVC2019 для текущей версии инструмента, которая, очевидно, была скомпилирована с MSVC2017 (хотя в окне about не сказано, с какой точной версией цепочки инструментов или компилятора, увы).

Все вам нужна бинарно-совместимая DLL (очевидно), что означает компиляцию Win32 из бинарно-совместимого компилятора Microsoft (который теоретически может быть столь же стар, как MSVC2015, что касается бинарной совместимости, но, очевидно, ничего, кроме самой последней версии toolchain, вероятно, когда-нибудь сработает, это чисто академический интерес (1035 *).

Нет необходимости даже компилировать в режиме выпуска, очевидно, отладочные библиотеки DLL работают точно так же.

Попытка заставить работать предыдущую версию MSV C - это не только кошмар недокументированных и crypti c сбои, это также совершенно бесполезно.

И решение это ...

Просто создайте проект для MSV C 2019 (что Qt почему-то называет MSVC2017 ) в режиме WIn32 / release и поместите полученную DLL go [beep] mn в этот каталог:

<Qt install root>\Qt\Tools\QtCreator\bin\plugins\designer

Да, все верно. Вы получаете Qt\Tools\QtCreator\lib\qtcreator\plugins, где, кажется, происходят странные вещи, но никакой «плагин виджетов» никогда не будет загружен, и еще один Qt\Tools\QtCreator\bin\plugins с кучей подкаталогов, включая папку «дизайнер», куда, наконец, придет ваш маленький «плагин виджетов». alive.

Вы также получаете много дерьмовых и / или устаревших советов из различных веток форума Qt. Очевидно, Qt ползет с кучей разных «плагинов», которые не все живут в одной и той же лачуге и любят мигрировать с каждой новой минорной версией ... Я также не нашел ни подсказок, ни списков полезных каталогов в документации Qt. И поверьте мне, я прочитал довольно много документации по Qt.

И, кстати, чтобы использовать многократно используемые виджеты, вам все равно нужно будет предоставить либо их исходный код, либо заголовок интерфейса и некоторую DLL / LIB для linking.
Этот плагин - хороший способ интегрировать ваш виджет в редактор GUI, но он не установит библиотеку, содержащую ваш виджет или его заголовок интерфейса (это было бы на самом деле изящным трюком :)) .

Кровавый ужасный кошмар. Но теперь все кончено, и играть с моими маленькими милашками для виджетов - это весело. Yay ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...