Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Проблема с использованием системы ресурсов

Автор: groove 24.2.2008, 21:39

С помощью дизайнера создаю форму, добавляю для нее файл ресурсов, в которых запихиваю картинки.
Затем эти самые картинки использую в виджетах формы.

Как бы я не использовал ресурсы (компилировал в бинарник приложения, либо подключал как внешние ресурсы), на другой машине всегда картинки пропадают. На той где компилируется - все ок, а стоит попробовать под другой ОС - так обязательно проблема.

Никто не сталкивался?

Автор: ViGOur 24.2.2008, 22:54

Покажи файл ресурсов.
К чему ты цепляешь картинки и каким образом?
Какая версия Qt и компилятор?

Поподробней опиши свои действия...

Автор: Litkevich Yuriy 25.2.2008, 0:30

groove, Не забудь что путь к ресурсам начинается с двоеточия:

":/pics.png"

Автор: groove 26.2.2008, 11:52

Вот тестовый проект: http://ifolder.ru/5502423

Ресурсы берутся из внешнего файла. Если запускать на машине, где нет Qt, тогда картинка на форме отображена не будет, если запускать там же где и компилировалось, то все OK.

Для запуска на чистой машине потребуются файлы: mingwm10.dll, QtCore4.dll, QtGui4.dll.

Версия Qt: 4.3.2, OpenSouce Edition. Бря сборку TrollTech.
Версия MinGW: MinGW-3.2.0.

Автор: Litkevich Yuriy 26.2.2008, 18:31

уменя была такая проблема:
скомпилил на виндовозе, картинки задуманы читатся при запуске приги из предопределенного каталога, если каталог таскаю с бинарем по виндовозовским тачкам, то все путем, пересобрал в Лине, картинок нет, путь был указан к ним так:

p_pix->load("pics/well_prsr.png");


зделал так:
p_pix->load("./pics/well_prsr.png");

все за работало, и в Лине и Виндовозе

Автор: groove 27.2.2008, 8:46

Цитата(Litkevich Yuriy @ 26.2.2008, 18:31) *
уменя была такая проблема:
скомпилил на виндовозе, картинки задуманы читатся при запуске приги из предопределенного каталога, если каталог таскаю с бинарем по виндовозовским тачкам, то все путем, пересобрал в Лине, картинок нет, путь был указан к ним так:
p_pix->load("pics/well_prsr.png");


зделал так:
p_pix->load("./pics/well_prsr.png");

все за работало, и в Лине и Виндовозе

Тут в пределах одной ОС нифига не работает.

Автор: AD22 4.3.2008, 10:06

Та же проблема. Не отображаются картинки, если запускаю на другой машине. Путь указываю, чтобы отображалось полный, т.е., например, D:/Projects/Src/TransasLogViewer/Images/open.png.
На той машине, что компилю, все отображаются.

P.S. exe-файл лежит вот здесь D:\Projects\Win32\Bin\Release\TransasLogViewer\TLV.exe,
либо D:\Projects\Win32\Bin\Debug\TransasLogViewer\TLV.exe

Автор: Litkevich Yuriy 4.3.2008, 13:26

AD22,
Нельзя абсолютный путь указывать, это большие грабли, либо относительно приложения, либо с ситемными переменными (актуально для линуха)

groove,
Вообщем попробывал я твою прогу посмотреть в профилеровщике, ня своей машине (есть Qt) и на VMWare (нет Qt), сравнил логи, на моей машине в логе есть такие строчки:

Цитата
LoadLibraryW("F:/Qt/4.3.2/plugins/imageformats/qjpeg4.dll") called from "QTCORE4.DLL" at address 0x101134F5.
Loaded "QJPEG4.DLL" at address 0x017C0000. Successfully hooked module.
DllMain(0x017C0000, DLL_PROCESS_ATTACH, 0x00000000) in "QJPEG4.DLL" called.
DllMain(0x017C0000, DLL_PROCESS_ATTACH, 0x00000000) in "QJPEG4.DLL" returned 1 (0x1).
LoadLibraryW("F:/Qt/4.3.2/plugins/imageformats/qjpeg4.dll") returned 0x017C0000.
GetProcAddress(0x017C0000 [QJPEG4.DLL], "qt_plugin_instance") called from "QTCORE4.DLL" at address 0x101143F5 and returned 0x017C13B0.


а на другой машине в логе нет таких строчек, положил qjpeg4.dll в каталог с бинарем, эфект тотже, ни картинки ни таких строчек в логе.

Надо думать как это плагин прицепить.

Автор: Litkevich Yuriy 4.3.2008, 15:57

БЛИН, я тут открытие совершил, у менято тоже проблема, svg-рисунки нечитаются, jpeg неиспользую, png читаются нормально :(

-- вобщем новая тема: http://www.forum.crossplatform.ru/index.php?showtopic=468

Автор: Litkevich Yuriy 8.3.2008, 22:21

groove, твое заработало, после некоторых экспериментов смотри http://www.forum.crossplatform.ru/index.php?showtopic=485&view=findpost&p=2282

Автор: trdm 12.3.2008, 1:17

Цитата(groove @ 26.2.2008, 11:52) *
Вот тестовый проект: http://ifolder.ru/5502423

без проблем все показало...

Автор: Litkevich Yuriy 12.3.2008, 1:54

Цитата(trdm @ 12.3.2008, 4:17) *
без проблем все показало...

на сырой тачке без Qt'ей?

Автор: ViGOur 12.3.2008, 9:04

Ну вот, а теперь по всей видимости нужно собирать и писать общее описание, чтобы не было мороки при перечитке... :)

Автор: AD 12.3.2008, 10:47

просьба: напишите точно, как надо путь указывать. Относительно чего, нужно ли или не нужно таскать сами картинки с собой? Указать путь к dll плагинов, это-то сделал. Заранее благодарю!

Автор: ViGOur 12.3.2008, 11:03

Litkevich Yuriy, есть время сделать описание как и что, просто ты вроде этим заморочился, соответственно и тему лучше знаешь. :)

Автор: AD 12.3.2008, 11:53

Цитата(ViGOur @ 12.3.2008, 11:03) *
Litkevich Yuriy, есть время сделать описание как и что, просто ты вроде этим заморочился, соответственно и тему лучше знаешь. :)

Мне все-равно кто, но поможете? Надо ли использовать void Q_INIT_RESOURCE ( name ) для динамической сборки? Вообще как сделать-то?

Автор: Litkevich Yuriy 12.3.2008, 12:59

Цитата(ViGOur @ 12.3.2008, 14:03) *
есть время сделать описание

у меня еще четкого представления не сложилось, а в срочном порядке искал путь по причине того, что через неделю надо будет шефу показать что-нибудь, бум Qt'я использовать или будем продолжать пользовать Builder 5.
Соответственно пока использую вариант тащить кучу dll'ок на сырую машину, сейчас другой головняк появился.
Описание пока четкого нет только наброски.

Автор: Litkevich Yuriy 12.3.2008, 13:01

AD, ну если тебе горит, именно распространение программы, пользуй пока http://www.forum.crossplatform.ru/index.php?showtopic=485&view=findpost&p=2305, у меня сечас напряг со временем

Автор: AD 13.3.2008, 17:34

Кстати есть еще один вопрос: есть dll-файлы под .jpg, .gif, .tiff, .svg; какой из них для .png использовать? Тот, что под .svg?
Хочу просто описать проблему: на счет dll-файлов и их использования все более-менее понятно. Непонятно как присобачить картинки так, чтобы они видны были. По всем учебникам выходит так, что если exe-file (назовем, для простоты, tlv.exe) лежит, предположим, в D:\QtEx\tlv.exe, то картинки лежат по адресу D:\QtEx\Images\*.png, которые заносятся в *.qrc файл, а затем вызываются вот под таким адресом :/images/*.png! Но даже сделав так, как указано в справочниках на других машинах ничего не отображается. :( Надо еще создавать .rcc файл? Для меня это загадка...... :blink: :unsure:

Автор: Litkevich Yuriy 13.3.2008, 17:44

с png можешь не беспокоится он всегда работает, он внутри Qt'ей
Это единственная, видимо, вещь с которой нет проблем.
Я делал так и это всегда работает, если конечно прога вообще запустилась:

  // Кнопки
  QPushButton    *btnStart = new QPushButton;
  QPushButton    *btnInfo = new QPushButton;
  QPushButton    *btnStop = new QPushButton;
    // Настраиваем кнопки
    btnStart->setMaximumSize(btn24);
    btnStart->setMinimumSize(btn24);
    
    btnInfo->setMaximumSize(btn24);
    btnInfo->setMinimumSize(btn24);
    
    btnStop->setMaximumSize(btn24);
    btnStop->setMinimumSize(btn24);
    
    // Устанавливаем иконки на кнопки
    btnStart->setIcon(QIcon(QString::fromUtf8("./pics/24px_On.png")));    
    btnStart->setIconSize(icon24);
    btnStart->setFlat(true);
    
    btnInfo->setIcon(QIcon(QString::fromUtf8("./pics/24px_Info.png")));    
    btnInfo->setIconSize(icon24);
    btnInfo->setFlat(true);
    
    btnStop->setIcon(QIcon(QString::fromUtf8("./pics/24px_Off.png")));    
    btnStop->setIconSize(icon24);
    btnStop->setFlat(true);

т.е. неиспользовал никаких файлов ресурсов,
прога лежит в каталоге Foo,
картинки в каталоге Foo/pics/
загружаются во время выполнения

Автор: AD 13.3.2008, 18:25

Цитата(Litkevich Yuriy @ 13.3.2008, 17:44) *
с png можешь не беспокоится он всегда работает, он внутри Qt'ей
Это единственная, видимо, вещь с которой нет проблем.

т.е. неиспользовал никаких файлов ресурсов,
прога лежит в каталоге Foo,
картинки в каталоге Foo/pics/
загружаются во время выполнения

Т.е. картинки таскаешь с собой?

Автор: Litkevich Yuriy 13.3.2008, 18:30

да, а какая разница, все равно еще dll'ки таскать, папкой больше папкой меньше.

Автор: AD 13.3.2008, 18:32

Цитата(Litkevich Yuriy @ 13.3.2008, 18:30) *
да, а какая разница, все равно еще dll'ки таскать, папкой больше папкой меньше.

Какие dll, кроме необходимых для запуска, т.е. QtGui4, QtCore4?

Автор: Litkevich Yuriy 13.3.2008, 19:01

ну мне еще mingwm10.dll, т.к. я MinGW пользую

Автор: AD 18.3.2008, 9:32

Блин, не работают эти png-картинки, хоть убей. Все перепробовал. Пока ничего не получилось, чтобы они отображались!

Автор: AD 3.4.2008, 16:26

Сделал Q_INIT_RESOURCE(tlv_resource). Все-равно пока что на других компах не отображается!

Автор: Litkevich Yuriy 3.4.2008, 16:35

расскажи как ты распространяешь свою софтину, что куда ставишь?

Автор: AD 3.4.2008, 16:51

Цитата(Litkevich Yuriy @ 3.4.2008, 17:35) *
расскажи как ты распространяешь свою софтину, что куда ставишь?

Картинки png-формата. В той же папочке, что и exe-file есть папка images, где и лежат эти картинки. В коде есть qrc - файл, где прописаны эти картинки! Еще что-то нужно для этих png?

Автор: ViGOur 3.4.2008, 17:08

Все никак не доберусь опробовать твою проблему до конца. :(

Автор: Litkevich Yuriy 3.4.2008, 17:26

AD, где лежит твой exe'шник?
где лежат Qt'явые dll'ки?

Автор: AD 3.4.2008, 18:05

Цитата(Litkevich Yuriy @ 3.4.2008, 18:26) *
AD, где лежит твой exe'шник?
где лежат Qt'явые dll'ки?

все dll лежaт в одной папке вместе с exe-file! Название папки что-ли дать? Не понимаю, какой ответ хочешь получить, извини? :)

Автор: Litkevich Yuriy 3.4.2008, 18:13

данный каталог в переменной PATH числится?
картинки у тебя в png, а то я забыл уже?

Автор: AD 3.4.2008, 18:33

Цитата(Litkevich Yuriy @ 3.4.2008, 19:13) *
данный каталог в переменной PATH числится?
картинки у тебя в png, а то я забыл уже?

А он долже обязательно числится??? Картинки в png!!!

Автор: Litkevich Yuriy 3.4.2008, 19:10

попробуй забить переменную PATH

Автор: ViGOur 3.4.2008, 20:54

Цитата(Litkevich Yuriy @ 3.4.2008, 20:10) *
попробуй забить переменную PATH
Думаю это не решение.
Попробую сварганитть пример работы с картинками, но как скоро не знаю, сами видите, не всегда время есть. :(

Автор: Litkevich Yuriy 4.4.2008, 4:23

AD, ты можешь дать какой нибудь исходник, простой?
Который у тебя не получается распространять, я бы попробывал у себя скомпилить и проверить.
---
вот моё:  wellwgt.zip ( 19.18 килобайт ) : 244

выглядеть должно так:

распространяю так:

Цитата
pics/
12-Wellwgt.exe
mingwm10.dll
QtCore4.dll
QtGui4.dll

mingwm10.dll, нужен т.к. компилирую с помощью MinGW32, в каталоге pics, лежат png-рисунки, которые на лету подгружаются.

т.е. если это у тебя будет работать, значит надо с файлами ресурсов разбираться.

Автор: Litkevich Yuriy 4.4.2008, 5:15

Еще вот от Макса Шлее пример с файлом http://lit-uriy.narod.ru/temp/Window.zip, у меня распространяется без проблем, так:

Цитата
Window.exe
mingwm10.dll
QtCore4.dll
QtGui4.dll

Автор: AD 4.4.2008, 15:38

Цитата(Litkevich Yuriy @ 4.4.2008, 5:23) *
AD, ты можешь дать какой нибудь исходник, простой?
Который у тебя не получается распространять, я бы попробывал у себя скомпилить и проверить.
---
вот моё:  wellwgt.zip ( 19.18 килобайт ) : 244

выглядеть должно так:

распространяю так:
Цитата
pics/
12-Wellwgt.exe
mingwm10.dll
QtCore4.dll
QtGui4.dll

mingwm10.dll, нужен т.к. компилирую с помощью MinGW32, в каталоге pics, лежат png-рисунки, которые на лету подгружаются.

т.е. если это у тебя будет работать, значит надо с файлами ресурсов разбираться.

Попробовал твой пример. Все заработало в примере. Заметил, что в папочке pics помимо png-картинок еще какие-то svg-файлы? Что это за файлы? Как их получить?

Автор: Litkevich Yuriy 4.4.2008, 15:41

Можешь их удалить, это файлы вектрной графики, из них я делал PNG, т.к. при масштабировании векторной графики качество картинки не меняется.

Автор: AD 6.5.2008, 10:23

Проблема с отображением картинок самоликвидировалась! Т.Е. картинки теперь отображаются! В чем фокус не очень понял, но картинки без особых помех отображаются на всех компьютерах! :)

Автор: ViGOur 6.5.2008, 11:50

Тэкс, а как решил то? :)

Автор: Litkevich Yuriy 6.5.2008, 11:52

Дык, он и сам не понял :)

Автор: kuler 12.11.2008, 16:09

почему в висуал студии при попытке задать windowicon появляется диалог в котором ничего нельзя сделать кроме как вручную ввести имя файла? (там есть 2 компонента, один из которых подписан "Preview"). При установке там имени файла иконка не появляется, а если в коде setWindowIcon(QIcon("1.png"));, то появляется.

Автор: kuler 13.11.2008, 12:02

a как qdialog установить иконку?

Автор: Litkevich Yuriy 13.11.2008, 12:23

Цитата(kuler @ 13.11.2008, 15:02) *
a как qdialog установить иконку?
что-то я не понял вопроса. Если он тоже применительно к студии, лучше выделить в отдельную тему, я думаю она быстрее людям на глаза попадется.

Автор: kuler 13.11.2008, 13:00

это вопрос вообще

windowIcon : QIcon
This property holds the widget's icon.

This property only makes sense for windows. Видимо изза этого не устанавливается (хотя диалог и есть отдельное окно)

Автор: Litkevich Yuriy 13.11.2008, 13:47

kuler, может я и не понял в чем проблема, но вот этот тест работает, я его переделал из http://www.forum.crossplatform.ru/index.php?showtopic=640&view=findpost&p=3672 под использование QDialog
 Qt_Ui_test_3.zip ( 46.31 килобайт ) : 144

Автор: kuler 13.11.2008, 14:15

Litkevich Yuriy,
чото я не понял как там присоединена иконка приложения

Автор: Litkevich Yuriy 13.11.2008, 14:20

главное чтобы ты с иконкой для диалога разобрался, а если тябя интерисует иконка exe'шника пока он не запущен, то задавай в указаной мною теме, если ты ее вообще прочитал.

Автор: kuler 13.11.2008, 15:38

так я и спрашивал про иконку, которая на заголовке окна

Автор: Litkevich Yuriy 13.11.2008, 15:40

Цитата(kuler @ 13.11.2008, 18:38) *
так я и спрашивал про иконку, которая на заголовке окна
ты мой пример скомпилил?

Автор: kuler 13.11.2008, 15:59

да, просмотрел все исходники и не увидел где связывается myappico.ico

Автор: Litkevich Yuriy 13.11.2008, 16:30

kuler, прости пожалуйста, я не тот пример залил :blush:
вот в этом  Qt_Ui_test_5.zip ( 15.02 килобайт ) : 84
, работает функция
setWindowIcon(QIcon(":/ico/images/myappico.png"));

Автор: kuler 13.11.2008, 16:42

Litkevich Yuriy, ничо, но все равно не понятно как иконка там устанавливается

Автор: Litkevich Yuriy 13.11.2008, 16:55

ну вызывается эта функция, в нее передается путь к иконке, если пут начинается с двоеточия, значит из ресурсов которые вкопилены в бинарь, а они все перечислены в qrc-файле, он в свою очердь записан в pro-файл.

Автор: kuler 13.11.2008, 17:41

Цитата(Litkevich Yuriy @ 13.11.2008, 16:55) *
ну вызывается эта функция, в нее передается путь к иконке, если пут начинается с двоеточия, значит из ресурсов которые вкопилены в бинарь, а они все перечислены в qrc-файле, он в свою очердь записан в pro-файл.

это ты наверно про второй пример, там то понятно, я про первый

просек почему у меня не работало, я создавал кюдиалог с Qt::WindowTitleHint

соответственно возникает вопрос а как совместить несовместимое? (мне не нужны кнопки закрыть, максимайз, минимайз)

Автор: AD 13.11.2008, 18:01

Цитата(kuler @ 13.11.2008, 17:41) *
соответственно возникает вопрос а как совместить несовместимое? (мне не нужны кнопки закрыть, максимайз, минимайз)

this -> setWindowState(windowState())

Автор: kuler 14.11.2008, 11:08

Цитата(AD @ 13.11.2008, 18:01) *
this -> setWindowState(windowState())

и что это значит? (попробывал, не помогло)

Автор: AD 14.11.2008, 12:55

Попробуй чуть похимичить с этим. Что-то я не помню точной инструкции. Но могу тебе из справки дать инфу:

Цитата
THIS
void QWidget::setWindowState ( Qt::WindowStates windowState )
Sets the window state to windowState. The window state is a OR'ed combination of Qt::WindowState: Qt::WindowMinimized, Qt::WindowMaximized, Qt::WindowFullScreen, and Qt::WindowActive.
If the window is not visible (i.e. isVisible() returns false), the window state will take effect when show() is called. For visible windows, the change is immediate. For example, to toggle between full-screen and normal mode, use the following code:
w->setWindowState(w->windowState() ^ Qt::WindowFullScreen);
In order to restore and activate a minimized window (while preserving its maximized and/or full-screen state), use the following:
w->setWindowState(w->windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
Note: On some window systems Qt::WindowActive is not immediate, and may be ignored in certain cases.
When the window state changes, the widget receives a changeEvent() of type QEvent::WindowStateChange.
See also Qt::WindowState and windowState().

Автор: kuler 14.11.2008, 14:15

Цитата(AD @ 14.11.2008, 12:55) *
Попробуй чуть похимичить с этим. Что-то я не помню точной инструкции. Но могу тебе из справки дать инфу:

это я прочитал, дык это минимайз и тд, а мне просто нада чтоб кнопки закрытия (крестик) и тд не отображались. сделать это можно передав Qt::WindowTitleHint, но при этом не отображается иконка окна.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)