Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не могу открыть файл
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Обработка XML
FladeX
Делал по аналогии с примером..
    QDomDocument doc("help");
    QFile file("help.xml");
    if (!file.open(QIODevice::ReadOnly))
    //if (file.open(QIODevice::NotOpen))
    {
        QMessageBox::warning(this, QObject::trUtf8("Предупреждение"), QObject::trUtf8("Ошибка 001. Невозможно открыть файл help.xml"));
        return;
    }
    if (!doc.setContent(&file))
    {
        QMessageBox::warning(this, QObject::trUtf8("Предупреждение"), QObject::trUtf8("Ошибка 002. Невозможно прочитать файл help.xml"));
        file.close();
        return;
    }
    file.close();

Файл help.xml лежит в той же директории, что и исходники. Права доступа ставил и "чтение", и "чтение и запись". Причем первая ошибка появляется только при проверке на ReadOnly, а если проверять на NotOpen, то ошибки нету, хотя дальше пишет ошибку контента.

Инклюды:
#include <QtGui>
#include <QDomDocument>
#include <QIODevice>

И файл проекта:
QT += xml


Где ошибка?
Litkevich Yuriy
проблема с открытием файла к XML ни какого отношения не имеет.

Цитата(FladeX @ 25.3.2009, 15:09) *
QFile file("help.xml");
эта запись на некоторых ОСьках не означает текущий каталог.
Попробуй так:
Цитата
QFile file("./help.xml");


я, обычно еще проверяю существует ли файл:
Цитата
if (!file.exists())



------------
Цитата(FladeX @ 25.3.2009, 15:09) *
Файл help.xml лежит в той же директории, что и исходники.
только сейчас подумалось, а бинарь там же где и исходники?
FladeX
Цитата(Litkevich Yuriy @ 25.3.2009, 13:05) *
Цитата(FladeX @ 25.3.2009, 15:09) *
Файл help.xml лежит в той же директории, что и исходники.
только сейчас подумалось, а бинарь там же где и исходники?

Все файлы проекта лежат в одной директории. И .xml там же.

file.exists() выдает false и для help.xml, и для ./help.xml.
AD
Ну тут уже проскочила идея - уточню: в том виде, что описан тут предполагает, что исполняемый файл и файл xml лежат в одном каталоге. Желательно прописывать полный путь к файлу (на всякий случай, даже если они лежат в одном каталоге). Проверять на существование (exists) тоже желательно!
FladeX
Они и лежат в одном каталоге. А полный путь прописывать даже не знаю как - программа используется на разных компах с разными ОС, установщика нету, поэтому путь может быть абсолютно любым.
Litkevich Yuriy
FladeX, попробуй вывести содержимое каталога, может у тебя текущий каталог где-то изменен
FladeX
Хм, прописал полный путь:
    QFile file("/home/opensuse/qt/expertsystem/help.xml");

и заработало. А почему же относительный путь не получается?
AD
Цитата(FladeX @ 25.3.2009, 13:19) *
Они и лежат в одном каталоге. А полный путь прописывать даже не знаю как - программа используется на разных компах с разными ОС, установщика нету, поэтому путь может быть абсолютно любым.

Попробуйте так:
QString name_file(QDir::currentPath() + QDir::separator() + QString("help.xml"));

Проверьте в дебаге, что в данной строке выводится корректный путь к файлу.
FladeX
Цитата(Litkevich Yuriy @ 25.3.2009, 13:20) *
FladeX, попробуй вывести содержимое каталога, может у тебя текущий каталог где-то изменен

С этим вроде все в порядке:
opensuse:/home/opensuse/qt/expertsystem # qmake
opensuse:/home/opensuse/qt/expertsystem # make

opensuse:/home/opensuse/qt/expertsystem # ls
expertsystem       expertsystem.h   expertsystem.pro   expertsystem.qrc~  favicon.ico    help.xml   main.cpp   Makefile              qrc_expertsystem.cpp
expertsystem.cpp   expertsystem.h~  expertsystem.pro~  expertsystem.rc    function.txt   help.xml~  main.cpp~  moc_expertsystem.cpp  qrc_expertsystem.o
expertsystem.cpp~  expertsystem.o   expertsystem.qrc   expertsystem.rc~   function.txt~  images     main.o     moc_expertsystem.o
opensuse:/home/opensuse/qt/expertsystem #

Я компилю из баша, и путь берется относительный.
Litkevich Yuriy
Цитата(FladeX @ 25.3.2009, 16:24) *
С этим вроде все в порядке:
я имел в виду: изменен в программе
тест:
QDir tstDir("./");
   qDebug() << "Path \"./\" is:" << tstDir.absolutePath();
   qDebug() << "Real current path is:" << QDir::current();
   qDebug() << "File list:" << tstDir.entryList(QDir::Files);
AD
Если не совпадет, тогда можно поступить так:
выбрать каталог, который есть на любой машине (либо каталог временных файлов, либо каталог "моих документов"), перенести туда help.xml и написать следующим образом:
QString name_file(QDir::homePath() + QDir::separator() + QString("help.xml"));
FladeX
Цитата(AD @ 25.3.2009, 13:23) *
Цитата(FladeX @ 25.3.2009, 13:19) *
Они и лежат в одном каталоге. А полный путь прописывать даже не знаю как - программа используется на разных компах с разными ОС, установщика нету, поэтому путь может быть абсолютно любым.

Попробуйте так:
QString name_file(QDir::currentPath() + QDir::separator() + QString("help.xml"));

Проверьте в дебаге, что в данной строке выводится корректный путь к файлу.

QDir::currentPath() почему-то определился как /home/opensuse/Documents
В программе не менял нигде это значение. Более того, использую графические файлы, которые лежат в той же директории - и все нормально. Только их явно указывал в .qrc

Сейчас остальное проверю.
Litkevich Yuriy
Цитата(FladeX @ 25.3.2009, 16:33) *
Более того, использую графические файлы, которые лежат в той же директории - и все нормально. Только их явно указывал в .qrc
они вкомпилены в бинарь, коль уж ты из в ресурсы засунул.

Цитата(FladeX @ 25.3.2009, 16:33) *
Сейчас остальное проверю.
проверь по сообщению №10
AD
Цитата(Litkevich Yuriy)
]проверь по сообщению №10

Проверяй обоими способами! :)
FladeX
Цитата(Litkevich Yuriy @ 25.3.2009, 13:25) *
тест:
QDir tstDir("./");
   qDebug() << "Path \"./\" is:" << tstDir.absolutePath();
   qDebug() << "Real current path is:" << QDir::current();
   qDebug() << "File list:" << tstDir.entryList(QDir::Files);

Эээ.. а как это в баше сделать?

Цитата(AD @ 25.3.2009, 13:28) *
Если не совпадет, тогда можно поступить так:
выбрать каталог, который есть на любой машине (либо каталог временных файлов, либо каталог "моих документов"), перенести туда help.xml и написать следующим образом:
QString name_file(QDir::homePath() + QDir::separator() + QString("help.xml"));

Такой вариант не устраивает, теряется кроссплатформенность :unsure:
AD
Цитата(FladeX @ 25.3.2009, 14:30) *
Такой вариант не устраивает, теряется кроссплатформенность :unsure:

Почему? Разве homepath нет в Linux, Unix, MacOS? Я не видел, чтобы в ассистенте говорилось, что функция применима только в Windows!
FladeX
homepath() разный будет в разных ОС. И копировать придется в строго определенную папку. Единственный способ сохранить после этого юзабельность - делать инсталлер. А мне рано этим заниматься)
Litkevich Yuriy
Цитата(FladeX @ 25.3.2009, 17:30) *
Эээ.. а как это в баше сделать?
а причём здесь Bash?
ты это в свою программу вставь, сразу перед строчкой открытия твоего XML'ьника. И запусти программу из консоли, увидишь вывод.
AD
Цитата(FladeX @ 25.3.2009, 14:37) *
homepath() разный будет в разных ОС. И копировать придется в строго определенную папку. Единственный способ сохранить после этого юзабельность - делать инсталлер. А мне рано этим заниматься)

Тогда такой вариант: в функции main есть параметр: char *argv[]. argv[0] - это абсолютное имя исполняемого файла (имя файла вырезать из строки). Запомнить этот путь в какую-нибудь глобальную переменную и использовать!
Litkevich Yuriy
Цитата(AD @ 25.3.2009, 18:47) *
Тогда такой вариант: в функции main есть параметр: char *argv[]. argv[0] - это абсолютное имя исполняемого файла (имя файла вырезать из строки). Запомнить этот путь в какую-нибудь глобальную переменную и использовать!
так проще:
qApp->applicationDirPath()
AD
Так последние советы помогли решить проблему или нет?
FladeX
Я не пойму, как передать путь к программе в нужный метод. Объясните на пальцах.
ЗЫ. Сильно не бить, правда не знаю(
AD
Цитата(FladeX @ 5.5.2009, 15:44) *
Я не пойму, как передать путь к программе в нужный метод. Объясните на пальцах.
ЗЫ. Сильно не бить, правда не знаю(

есть глобальная Qt-шная переменная qApp.
С помощью метода
qApp->applicationDirPath()

получаете в переменной типа QString путь к исполняемому файлу программы, а далее подставляете это значение в нужные методы, функции и т.п.
Antiloh.com
Примечание
Класс QDir не предоставляет методов для определения текущего
каталога приложения. Но если вам потребуется определить, из какого каталога
было запущенно приложение, то следует воспользоваться методом
QApplication: :applicationDirPath() , либо
QApplication::applicationFilePath(), возвращающим, ВДОAВОК КО
всему, и имя приложения.
kuzulis
А может сделать конфиг на базе QSettings, и уже в конфигурационном файле прописывать где лежит этот help.xml не? :)
berserk
Цитата(FladeX @ 5.5.2009, 15:44) *
Я не пойму, как передать путь к программе в нужный метод. Объясните на пальцах.
ЗЫ. Сильно не бить, правда не знаю(

1. если из main(), то путь к директории где лежит программа возвращает QCoreApplication::applicationDirPath()
2. Ели передаёшь в функцию которая описана в main.cpp, то этот путь можно передать в неё либо через параметр, либо через ссылку, либо через указатель, либо через глобальную переменную.
3. Если передаёшь этот путь в объект, то такие варианты
а. через конструктор
б. создаёшь в объекте переменную в области public и из main() через . или через -> присваиваешь ей значение...

Если что нагнал поправьте...
kwisp
berserk,
при чем тут main?
QCoreApplication::applicationDirPath() статическая функция, вызывай откуда хочешь .
berserk
Цитата(kwisp @ 31.7.2009, 14:37) *
QCoreApplication::applicationDirPath()

мда нагнал, просто я передавал из main в класс, а include QApplication не делал, может поэтому у меня внутри класса не сработало...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.