Russian Qt Forum

Qt => Вопросы новичков => Тема начата: lzv от Апрель 12, 2013, 18:44



Название: [решено] Не работает qt.conf
Отправлено: lzv от Апрель 12, 2013, 18:44
Здравствуйте.

Система windows xp, Qt версии 4.8.

Пытаюсь перенести приложение на компьютер без Qt. Но в приложении используется SQLite. Если положить файл qsqlite4.dll в тот же каталог, где он был при компиляци программы (С:\Qt\4.8.4\plugins\sqldrivers\), то программа работает. Во всех других случаях - если положить его рядом с exe-шником, либо в подкаталог sqldrivers, либо вообще в plugins\sqldrivers - не работает.
Пробую использовать qt.conf, но он не подхватывается. Ложил его рядом с exe-ником, а так же пробовал поместить в ресурсы в префикс /qt/etc/ но не работает.
Проверяю пути с помощью QLibraryInfo::location, они не меняются.

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


Название: Re: Не работает qt.conf
Отправлено: Alex Custov от Апрель 12, 2013, 19:21
что-то у тебя не так, у всех sqlite работает, а у тебя нет. Правильный подкаталог, куда класть qsqlite - sqldrivers/. Вся остальная инфа бесполезна, опиши подробно как и что ты делаешь.


Название: Re: Не работает qt.conf
Отправлено: lzv от Апрель 12, 2013, 20:56
Вот содержимое файла main.cpp:
Код:
#include <QtGui>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec* codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForLocale(codec);

    QString sys_lang = QLocale::system().name();
    QTranslator translator;
    if (sys_lang == "ru_RU" || sys_lang == "ru") {
translator.load("lang_ru", QCoreApplication::applicationDirPath());
a.installTranslator(& translator);
    }

    QFile llog(QCoreApplication::applicationDirPath() + "/llog.txt");
    llog.open(QIODevice::ReadWrite);

    llog.write(QString("PrefixPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::PrefixPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("DocumentationPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::DocumentationPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("HeadersPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::HeadersPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("LibrariesPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::LibrariesPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("BinariesPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::BinariesPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("PluginsPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::PluginsPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("ImportsPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::ImportsPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("DataPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::DataPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("TranslationsPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::TranslationsPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("SettingsPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::SettingsPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("ExamplesPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::ExamplesPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("DemosPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::DemosPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.close();

    MainWindow w;
    w.show();
   
    return a.exec();
}

Содержимое qt.conf, например такое:
Код:
[Paths]
Prefix = c:/my_projects/build-Qtimer-Desktop-Release/release/
Plugins = ppppp


Включаю файл qt.conf в ресурсы по префиксу /qt/etc/
Компилирую, получаю exe, копирую его в другую папку, с ним ложу QtCore4.dll, QtGui4.dll и QtSql4.dll. Затем запускаю. Получаю файл llog.txt:
Код:
PrefixPath: C:\Qt\4.8.4
DocumentationPath: C:\Qt\4.8.4\doc
HeadersPath: C:\Qt\4.8.4\include
LibrariesPath: C:\Qt\4.8.4\lib
BinariesPath: C:\Qt\4.8.4\bin
PluginsPath: C:\Qt\4.8.4\plugins
ImportsPath: C:\Qt\4.8.4\imports
DataPath: C:\Qt\4.8.4
TranslationsPath: C:\Qt\4.8.4\translations
SettingsPath: C:/Qt/4.8.4
ExamplesPath: C:\Qt\4.8.4\examples
DemosPath: C:\Qt\4.8.4\demos

Удаляю llog.txt. Ложу qt.conf рядом с exe-шником, запускаю. Содержимое llog.txt то же самое.
Удаляю llog.txt. Удаляю ресурсы, компилирую. Заменяю exe-шник, файл qt.conf рядом с ним. Запускаю. Содержимое llog.txt то же самое.


Название: Re: Не работает qt.conf
Отправлено: Alex Custov от Апрель 12, 2013, 21:01
не нужен тебе qt.conf для sqlite плагина, нужно дебажить почему он на целевой системе не погружается. Компилятор mingw? Покажи структуру каталогов программы на целевой системе.


Название: Re: Не работает qt.conf
Отправлено: lzv от Апрель 12, 2013, 21:09
Компилятор VS 2010.
Не подгружается, потому что qsqlite4.dll ищется в каталоге, где он был при компиляции программы. Если его туда положить, то все работает.
Структура простая - все файлы в одном каталоге.


Название: Re: Не работает qt.conf
Отправлено: Bepec от Апрель 12, 2013, 21:16
Я те по секрету скажу. То, что он ищет плагины ещё и по qt.conf не значит, что пути для приложения изменяются :)

Должно работать. Нарушить эту часть Qt практически невозможно :D Скинь файл программы с дллками и дллкой плагины, вот и посмотрим что не работает :D


Название: Re: Не работает qt.conf
Отправлено: Alex Custov от Апрель 12, 2013, 21:17
Не подгружается, потому что qsqlite4.dll ищется в каталоге, где он был при компиляции программы.

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

Структура простая - все файлы в одном каталоге.

плагин на целевой системе лежит в подкаталоге sqldrivers?


Название: Re: Не работает qt.conf
Отправлено: lzv от Апрель 12, 2013, 21:26
плагин на целевой системе лежит в подкаталоге sqldrivers?

Пробовал по разному -  в папке exe-шника, в sqldrivers, в plugins\sqldrivers. Не работает ни в одном случае.


Название: Re: Не работает qt.conf
Отправлено: lzv от Апрель 12, 2013, 21:38
Попробовал взять QtCore4.dll, QtGui4.dll и QtSql4.dll не из дистрибутива Qt а из дистрибутива Qt Creator. Компилировал программу в прежних условиях, эти dll нужны только при запуске уже готового exe-файла.
После замены dll пути стали такими:
Код:
PrefixPath: q:\install\qt-4.8.4
DocumentationPath: q:\install\qt-4.8.4\doc
HeadersPath: q:\install\qt-4.8.4\include
LibrariesPath: q:\install\qt-4.8.4\lib
BinariesPath: q:\install\qt-4.8.4\bin
PluginsPath: C:\Qt\qtcreator-2.7.0\plugins
ImportsPath: C:\Qt\qtcreator-2.7.0\bin
DataPath: q:\install\qt-4.8.4
TranslationsPath: q:\install\qt-4.8.4\translations
SettingsPath: q:/install/qt-4.8.4
ExamplesPath: q:\install\qt-4.8.4\examples
DemosPath: q:\install\qt-4.8.4\demos

(Хотя вроде я не замечал в системе диска q: Но те что начинаются с C: - существуют)

qt.conf так же ни на что не влияет. И так же пробовал по разному положить драйвер.
Видимо как то в этих dll прописывается путь при установке Qt и Creator-а.

 ???


Название: Re: Не работает qt.conf
Отправлено: Bepec от Апрель 12, 2013, 22:05
Я те по секрету скажу. То, что он ищет плагины ещё и по qt.conf не значит, что пути для приложения изменяются :)

Должно работать. Нарушить эту часть Qt практически невозможно :D Скинь файл программы с дллками и дллкой плагины, вот и посмотрим что не работает :D


Название: Re: Не работает qt.conf
Отправлено: lzv от Апрель 13, 2013, 01:30
Скачать можно здесь https://github.com/lzv/qtimer/tree/master/installs
файл "qtimer for windows xp 32 bit.7z"
Там dll из дистрибутива самой Qt.
Каталогом выше сами исходники.

Без драйвера сама программа запускается, он задействуется при открытии файла данных и работе с ним.


Название: Re: Не работает qt.conf
Отправлено: Bepec от Апрель 13, 2013, 08:40
http://spolab.ru/blog/80-neponyatki-s-plaginami-qt


Название: Re: Не работает qt.conf
Отправлено: lzv от Апрель 13, 2013, 16:14
addLibraryPath тоже не помогает. Устанавливал как относительный путь (с точкой) так и абсолютный (получаемый через QCoreApplication::applicationDirPath()).
Так же пробовал setLibraryPaths.


Название: Re: Не работает qt.conf
Отправлено: Serr500 от Апрель 13, 2013, 17:02
http://files.mail.ru/86D9A947688A4AC58A63D14A84788E0C (http://files.mail.ru/86D9A947688A4AC58A63D14A84788E0C)

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

Если вкратце, то проблемы из-за того, что у Вас переменные типа QSqlDatabase объявлены как static. В этом случае они инициализируются слишком рано и все попытки поиска плагинов в других каталогах происходят уже после их инициализации. Я перенёс инициализацию в конструктор и всё заработало.


Название: Re: Не работает qt.conf
Отправлено: lzv от Апрель 13, 2013, 19:45
Serr500 спасибо, работает!
Спасибо так же и все остальным, кто пытался помочь  :)