Значок не загружается при запуске приложения извне Qt Creator

У меня есть файл *.ico.

Значок загружается функцией setWindowIcon(). Я добавил файл *.ico в файл ресурсов. Когда я запускаю приложение из Qt Creator, значок отображается правильно. Но когда я запускаю приложение извне Qt Creator, значок не отображается. Приложение успешно запускается и работает, но значок не отображается.

this->setWindowIcon(QIcon(":/icon/MiniAMR.ico")); // OK, icon load (inside Qt)

/* this string in .pro-file */
RESOURCES += \
    res.qrc

Пожалуйста помоги.


person Konstantin    schedule 04.04.2019    source источник
comment
Это странно. Первое, что я хотел бы проверить, это то, что программа, которую вы запускаете из Qt Creator, совпадает с той, которую вы запускаете напрямую. Возможно, Q Creator строится в каталоге релиза, а вы запускаете старую версию из каталога отладки. Если это не так, попробуйте добавить отладочный вывод (qDebug()), чтобы проверить, доступен ли файл ico во время выполнения.   -  person Benjamin T    schedule 04.04.2019
comment
@BenjaminT, я частично исправил эту проблему. Я добавил в .pro-файл следующую строку: win32:RC_ICONS = MiniAMR.ico и это работает! Но я хочу использовать это изображение в других местах своего кода. Например, я хочу отображать картинку в виджете: QPixmap pix(:/icon/MiniAMR.ico); ui-›label_pic-›setPixmap(pix); и это не сработало :(   -  person Konstantin    schedule 04.04.2019
comment
RC_ICONS для значка исполняемого файла. Это обрабатывается Windows, а не Qt, qmake просто передаст значение компоновщику при создании исполняемого файла. С другой стороны, когда вы отображаете изображение в пользовательском интерфейсе, это делает Qt. Однако Qt не поддерживает файлы ico. См. stackoverflow.com/questions/14456683/ и doc. qt.io/qt-5/qimagereader.html#supportedImageFormats   -  person Benjamin T    schedule 05.04.2019
comment
Я бы сказал, что тот факт, что ico вообще работает, кажется, предполагает, что формат действительно поддерживается... :) Я не знаю, почему в документах QImage не упоминается формат ICO, может быть, потому, что требуется плагин, но это Плагин долгое время был частью Qt. Лично я бы не стал использовать ICO для чего-либо, кроме значка RC.   -  person Maxim Paperno    schedule 05.04.2019
comment
Спасибо всем за рекомендации. Я изменил .ico-файл на .png-файл, и это работает для загрузки в QLabel. Для загрузки иконки я оставил предыдущую версию с win32:RC_ICONS=MiniAMR.ico в .pro-файле   -  person Konstantin    schedule 05.04.2019
comment
@BenjaminT Я согласен, что это вопрос, похожий на тот, который вы обманули, но этот ответ неверен (см. мой предыдущий комментарий здесь). В ответе уже есть комментарий о том, что он неверен (или, по крайней мере, вводит в заблуждение). У вас есть рекомендации, как лучше поступить?   -  person Maxim Paperno    schedule 05.04.2019
comment
@Konstantin Ты случайно не пробовал мое предложенное решение? Это может быть полезно для всех, кто придет и найдет этот вопрос/ответ.   -  person Maxim Paperno    schedule 05.04.2019
comment
@Konstantin Я проголосовал за повторное открытие вопроса, поскольку он не совсем тот же, а вопрос, на который я ссылался, имеет ложный ответ.   -  person Benjamin T    schedule 06.04.2019
comment
@Konstantin Пожалуйста, посмотрите на функцию supportedImageFormat(), она сообщит вам во время выполнения, какие плагины формата изображения загружены. Если вы обнаружите какие-либо различия, это означает, что вам не хватает плагинов (в данном случае qico.dll). Самый простой способ решить эту проблему — использовать windeployqt.   -  person Benjamin T    schedule 06.04.2019


Ответы (1)


Скорее всего, вам нужно скопировать файл plugins/imageformats/qico.dll из установки Qt, с которой вы собираете, в каталог вашего исполняемого файла. Поместите его в подпапку, например: <your_executable>/imageformats/qico.dll. При тестировании отладочной сборки вам понадобится версия dll с суффиксом d (qicod.dll).

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

person Maxim Paperno    schedule 05.04.2019
comment
Вы правы, но правильным решением является использование windeployqt. Он не только скопирует qico.dll, но и пропатчит Qt5Core.dll, чтобы он искал плагин в нужной подпапке. Также он развернет все плагины, которые могут понадобиться приложению. - person Benjamin T; 06.04.2019
comment
@BenjaminT windeployqt - это совсем другая проблема. Мой ответ касается конкретной потребности в этом вопросе (или, по крайней мере, пытается, мы не знаем, что ОП действительно пытается это сделать). И нет необходимости использовать windeployqt, я развернул довольно много приложений Qt без него, и нет необходимости что-либо исправлять, чтобы развернуть приложение Qt в Windows. Кроме того, он имеет тенденцию копировать кучу вещей, которые вам на самом деле не нужны для развертывания приложения. Итак, если кто-то знает, что они делают, на самом деле лучше выполнить эти шаги вручную (или написать их самостоятельно). Все это выходит за рамки этого вопроса/ответа. - person Maxim Paperno; 06.04.2019
comment
Не обязательно использовать windeployqt для развертывания библиотек Qt, но это самый простой и официально задокументированный способ, плагин и зависимости qml. Да, в конечном итоге он развертывает больше, чем вам нужно, поскольку он развертывает все, что может понадобиться, и, таким образом, предотвращает такие ошибки, когда люди забывают плагин. - person Benjamin T; 08.04.2019
comment
Наконец, необходимо исправить Qt5Core.dll, так как его путь установки жестко запрограммирован (например, qt_prfxpath=C:\Qt\5.12.2\mingw73_64). windeployqt изменит это на qt_prfxpath=.. Невыполнение этого может создать дополнительные проблемы. И тот факт, что вы развернули множество приложений Qt без исправлений, и это сработало, не означает, что вы поступаете правильно. У других людей были и есть проблемы, когда они этого не делают. - person Benjamin T; 08.04.2019