Russian Qt Forum
Ноябрь 23, 2024, 10:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Подключение плагинов при переносе на машину без установленной Qt.  (Прочитано 29581 раз)
ilot
Гость
« : Декабрь 21, 2009, 18:24 »

Здравствуйте. Столкнулся с проблемой - при переносе на машину без установленной библиотеки QT не подключается плагин для работы с изображением (qjpeg4.dll) - там, где должна быть картинка, пустое место. Все остальное работает нормально. Решения, которые я пробовал мне не помогли. А пробовал я следующие способы:

1. Добавление  в функцию main() дополнительного пути к списку, по которому приложение производит поиск библиотек:
Код:
QApplication app(argc,argv);
QApplication::addLibraryPath(app.applicationDirPath() + "/plugins/");
в папку plugins перенес все папки с плагинами;

2. копировал в директорию с исполняемым файлом папку с нужными плагинами (imageformats);

3. пробовал применять конфигурационный файл qt.conf следующего содержания:
Код:
[Path]
Plugins = plugins
где plugins - папка с плагинами, находится в директории с исполняемым файлом.
qt.conf нормально подхватывается приложением - предопределенные пути изменяются как нужно(проверял с помощью QLibraryInfo), но
эффекта нет.

Других вариантов у меня нет. У кого есть собственный опыт решения такой проблемы?

Qt собрана как shared. Проект собирают в VS2008. Статическая сборка проекта мной не рассматривается.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 21, 2009, 18:42 »

Поищи по форуму, вопрос уже не раз поднимался. Если не найдешь, отпишись.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilot
Гость
« Ответ #2 : Декабрь 21, 2009, 19:00 »

Да, поднимался. Например, здесь http://www.prog.org.ru/topic_8865_0.html. Я просмотрел все темы, касающиеся проблем с плагинами (нашлось их немного). Я использовал предлагаемые решения, но мне это не помогло. Да и сами авторы, как в приведенном примере, не сообщали об успешном разрешении проблемы. Поэтому я решил создать новую тему.. Даже зарегистрироваться пришлось  Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 21, 2009, 19:08 »

Покажи место, где подгружаешь картинку в программе.
Таких проблем не должно быть, если собрать Qt с параметром -qt-libjpeg.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilot
Гость
« Ответ #4 : Декабрь 21, 2009, 19:20 »

Код:
QPixmap pix;
pix.load("picture.jpg");
m_picture = new QLabel;
m_picture->resize(600, 400);
m_picture->setFrameStyle(QFrame::Panel|QFrame::Raised);
m_picture->setPixmap(pix.scaled(QSize(600,400)));

На машине с установленной Qt все работает нормально, поэтому дело должно быть в подключении самого плагина.
Я смотрел ProcessExplorer-ом список dll, которые задействует приложение: при запуске в системе с Qt qjpeg4.dll загружается программой, а на целевой машине (без Qt) данная библиотека не подхватывается.

библиотека собиралась со следующими опциями:
Код:
configure -platform win32-msvc2008 -shared -qt-sql-odbc -qt-sql-sqlite -no-qt3support -no-opengl -no-phonon -qt-style-windowsxp
« Последнее редактирование: Декабрь 21, 2009, 19:25 от ilot » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Декабрь 21, 2009, 19:25 »

Попробуй полный путь к картинке, на всякий случай. Т.е. pix.load("c:\picture.jpg");
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Декабрь 21, 2009, 19:29 »

можно путь и относительный:
./picture.jpg

П.С. Пантер, ты забыл слеш заэкранировать
Записан

Юра.
ilot
Гость
« Ответ #7 : Декабрь 21, 2009, 19:42 »

А причем здесь путь к картинке? Программа, запущенная на машине с Qt,  ее прекрасно находит в собственной директории.
можно путь и относительный:
./picture.jpg
путь и так относительный указывается.

На всякий случай попробовал - не помогло.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Декабрь 21, 2009, 19:46 »

По идее варианта №2 (из твоего первого сообщения) достаточно.
Почисть кэш плагинов, возможно, при эксперементах в него был занесён этот плагин.
Записан

Юра.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Декабрь 21, 2009, 19:46 »

lit-uriy: каюсь, забыл. Улыбающийся
ilot: попробуй собрать с ключем -qt-libjpeg.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilot
Гость
« Ответ #10 : Декабрь 21, 2009, 20:27 »

lit-uriy: почитал про кеш плагинов...
Цитировать
In order to speed up loading and validation of plugins, some of the information that is collected when plugins are loaded is cached through QSettings. This includes information about whether or not a plugin was successfully loaded, so that subsequent load operations don't try to load an invalid plugin.
Таким образом, в кеш попадает информация обо всех когда либо загруженных плагинах: имя, успешность загрузки, timestamp последней модификации. Здесь начинается самое интересное: при запуске программы на "чистой" системе в реестре в нужном месте появляются записи обо ВСЕХ плагинах из папки imageformats. Отсюда можно сделать вывод, что плагины системой все-таки как-то подхватываются (вопрос: до конца ли?). Если удалить ветку с инфой о плагинах и запустить программу снова, то записи в реестре создаются заново. Вроде все правильно.. А нужно эффекта все нет - изображение не появляется.

Вообще говоря, чистка кеша (как и любого др. кеша) плагинов актуально только, если в них были произведены изменения. Например, если бы я занимался разработкой/модификацией плагинов. А так там все данные актуальны.

Пантер: можно, конечно, попробовать.. от безисходности. Только думается мне, что тогда бы на машине с Qt это тоже не работало.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Декабрь 21, 2009, 22:03 »

ну как вариант проверить на третьей машине, по варианту №2.

Есть ещё переменная окружения QT_DEBUG_PLUGINS, для отладки плагинов, но я никогда не пользовался.

Про отладку плагинов можно прочитать на русском здесь
« Последнее редактирование: Декабрь 21, 2009, 22:08 от lit-uriy » Записан

Юра.
crackedmind
Гость
« Ответ #12 : Декабрь 22, 2009, 10:30 »

Проверь, плагины вообще загружаются.

В OpenHomm я так проверяю.

Код:
void checkPlugins()
{
    QList<QByteArray> formats = QImageReader::supportedImageFormats();

    if ( !formats.contains("def") || !formats.contains("pcx" )) {
        QMessageBox::critical(NULL, "Critical error!", "Plugins didn't load. Files maybe corrupted. Try to re-install application.");
        exit(1);
    }
}

p.s. поддержка форматов def & pcx естественно реализована своими плагинами Улыбающийся
« Последнее редактирование: Декабрь 22, 2009, 10:34 от crackedmind » Записан
ilot
Гость
« Ответ #13 : Январь 15, 2010, 15:00 »

Проверь, плагины вообще загружаются.
На виртуальной машине поставил оригинальную сборку WinXPSP2. Перенес проект, результат тот же - jpg-картинка перестала отображаться.
Воспользовавшись советом от crackedmind, проверил подгружаемые плагины.

На машине с установленной Qt выдало такой список поддерживаемых форматов:
bmp gif ico jpeg jpg mng pbm pgm png ppm svg tif tiff xbm xpm

На "чистой" тестовой машине:
bmp pbm pgm png ppm xbm xpm

Недосдача... В замешательстве Сконвертировал jpg в png, пересобрал, перенес на тестовую машину - все нормально отображается.  Улыбающийся Буду использовать png, но вопрос так и остался открытым. Поэтому, если кто что-нибудь знает - пишите!

P.S. папка imageformats переносится с исполняемым файлом со всем своим содержимым.
Записан
SASA
Гость
« Ответ #14 : Январь 15, 2010, 15:50 »

А файлика qt.conf рядом не валяется?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.