Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: AlekseyK от Март 29, 2010, 21:47



Название: Ошибки кроссплатформенности
Отправлено: AlekseyK от Март 29, 2010, 21:47
Помогите разобраться пожалуйста: программа корректно работает в Windows (собрано mingw из Qt SDK), но в Линуксе часть функций не работает (дистрибутив openSUSE).

1) Следующий фрагмент прекрасно работает в Windows (QTextBrowser - textBrowser корректно отображает html страницу), а в Линуксе он пустой:
Код:
    // Load help text
    QString helpUrl; // Help file address
    if(QFile::exists(qApp->applicationDirPath() + "/LevitationBreathTechnic.htm"))
        helpUrl = qApp->applicationDirPath() + "/LevitationBreathTechnic.htm";
    else
        helpUrl = qApp->applicationDirPath() + "/../LevitationBreathTechnic.htm";

    ui->textBrowser->setSource("file:///" + helpUrl);
Примечание. Файл существует.

2) Phonon прекрасно функционирует и выводит звук в Windows:
Код:
    // Setup sound player and output

BreathWindow::BreathWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::BreathWindow)
{
    isSoundAvailable = true;    // QSound::isAvailable();
    sound = new Phonon::MediaObject(this);
    audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
    Phonon::createPath(sound, audioOutput);
}

void BreathWindow::play(QString sourceFile)
{
    if(sound->state() == Phonon::PlayingState)
        sound->stop();
    sound->setCurrentSource(Phonon::MediaSource(sourceFile));
    sound->play();
}
Но в Линуксе тишина. Файлы wav.


Название: Re: Ошибки кроссплатформенности
Отправлено: BRE от Март 29, 2010, 22:07
1) Потому что не правильно формируется URL. Попробуй так:
Код
C++ (Qt)
ui->textBrowser->setSource( QUrl::fromLocalFile( helpUrl ) );
 

2) А что передается в sourceFile?


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Март 29, 2010, 22:17
1) Потому что не правильно формируется URL. Попробуй так:
Код
C++ (Qt)
ui->textBrowser->setSource( QUrl::fromLocalFile( helpUrl ) );
 

Попробовал - тоже не работает. В чём ещё может быть проблема?
Файл html был создан в ОО и имеет кодировку cp1251, но она там указана явно: <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1251"> - может в этом проблема почему в Windows работает, а в Линуксе - нет?



2) А что передается в sourceFile?
Звук заработал, спасибо: в КДЕ были настройки на другую звуковую карту. Ещё добавил
a.setApplicationName("LevitationBreath");
после
QApplication a(argc, argv);
чтобы убрать сообщение
Цитировать
WARNING: Phonon needs QCoreApplication::applicationName to be set to export audio output names through the DBUS interface


Название: Re: Ошибки кроссплатформенности
Отправлено: kibsoft от Март 29, 2010, 22:40
Код:
ui->textBrowser->setSource("file:///" + helpUrl);
В Linux'е формируется такой адрес: /home/.., т.е. один слэш уже есть, поэтому эту строчку для Linux замени такой:
Код:
ui->textBrowser->setSource("file://" + helpUrl);

На всякий случай:
Код:
// Load help text
    QString helpUrl; // Help file address
    if(QFile::exists(qApp->applicationDirPath() + "/LevitationBreathTechnic.htm"))
        helpUrl = qApp->applicationDirPath() + "/LevitationBreathTechnic.htm";
    else
        helpUrl = qApp->applicationDirPath() + "/../LevitationBreathTechnic.htm";
#ifdef Q_WS_WIN
    ui->textBrowser->setSource("file:///" + helpUrl);
#endif
#ifdef Q_WS_X11
    ui->textBrowser->setSource("file://" + helpUrl);
#endif

Кстати, сам только вчера с этим столкнулся :) тоже создал тему, но потом понял почему :)


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Март 29, 2010, 23:04
Я и так, и так уже пробовал перед тем как сюда писать: и с двумя слэшами, и с тремя - оба варианта не работают. Есть ещё идеи?


Название: Re: Ошибки кроссплатформенности
Отправлено: Vass от Март 29, 2010, 23:18
Идеи в имени файла, оно у вас в разном регистре, вы точно по буквам проверили что, то, что написано в  программе соответствует файлу на диске, в линуксе ФС регистрозависимая.


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Март 29, 2010, 23:20
Идеи в имени файла, оно у вас в разном регистре, вы точно по буквам проверили что, то, что написано в  программе соответствует файлу на диске,
Выше код проверки, что файл физически присутствует на диске - отрабатывает.

в линуксе ФС регистрозависимая.
Эт, мы знаем: чай 11 лет в нём сидим ;)


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Март 29, 2010, 23:40
Добавил вывод url-a для проверки:
Код:
    ui->textBrowser->setSource(QUrl::fromLocalFile(helpUrl));
    std::cout << QUrl::fromLocalFile(helpUrl).toString().toStdString() << std::endl;
- отрабатывает.
; cat <url без file://> - выводит содержимое html файла корректно.


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Март 29, 2010, 23:50
Попробовал жёстко вбить исходный html в QTextBrowser в QtCreator - работает, будто setSource() вообще никак не влияет на результат. Может на событие show повесить загрузку?


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Март 30, 2010, 20:47
Ппц.... в Линуксововй версии надо добавить:

    ui->textBrowser->setSearchPaths(QStringList::QStringList("."));;

чтобы заработало.

Почему???!!!


Название: Re: Ошибки кроссплатформенности
Отправлено: crossly от Март 31, 2010, 12:09
а вот это тебе скажет документация по ОС... / в начале пути означает что поиск ведется с корневой директории... т.е. в данном случае нужно писать полный путь .... "точка" говорит о том что поиск ведется от текущего каталога...


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Апрель 15, 2010, 15:21
а вот это тебе скажет документация по ОС... / в начале пути означает что поиск ведется с корневой директории... т.е. в данном случае нужно писать полный путь .... "точка" говорит о том что поиск ведется от текущего каталога...

Какая хрен разница, если я указываю АБСОЛЮТНЫЙ путь?!


Название: Re: Ошибки кроссплатформенности
Отправлено: crossly от Апрель 15, 2010, 16:10
Код:
helpUrl = qApp->applicationDirPath() + "/../LevitationBreathTechnic.htm";
это не АБСОЛЮТНЫЙ путь


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Апрель 15, 2010, 16:50
Код:
helpUrl = qApp->applicationDirPath() + "/../LevitationBreathTechnic.htm";
это не АБСОЛЮТНЫЙ путь

Код:
helpUrl = qApp->applicationDirPath() + "/LevitationBreathTechnic.htm
- а это АБСОЛЮТНЫЙ - отрабатывает именно эта ветка кода.


Название: Re: Ошибки кроссплатформенности
Отправлено: crossly от Апрель 15, 2010, 17:21
какая версия Qt??
у меня на линухе прокатывает и
Код:
QUrl url("file://"+qApp->applicationDirPath()+"/test.sh");
и
Код:
QUrl url("file:///"+qApp->applicationDirPath()+"/test.sh");


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Апрель 15, 2010, 17:27
какая версия Qt??
у меня на линухе прокатывает и
Код:
QUrl url("file://"+qApp->applicationDirPath()+"/test.sh");
и
Код:
QUrl url("file:///"+qApp->applicationDirPath()+"/test.sh");

4.6.2. Тут видимо проблема не в url - он формируется корректно, а в QTextBrowser с его setSearchPaths()


Название: Re: Ошибки кроссплатформенности
Отправлено: crossly от Апрель 15, 2010, 17:41
я имею в виду что setSource и в том и в другом случае у меня нормально работает... Qt 4.5.3


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Апрель 15, 2010, 17:45
я имею в виду что setSource и в том и в другом случае у меня нормально работает... Qt 4.5.3

В винде у меня - да, работает, в линуксе с setSearchPaths. Припоминаю, что и в ранних версиях Qt была такая ерунда  в линуксе,- тоже надо было простой help вывести.


Название: Re: Ошибки кроссплатформенности
Отправлено: crossly от Апрель 15, 2010, 17:47
я же написал... у меня линукс


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Апрель 15, 2010, 18:04
Запишем в несчастные случаи ;)


Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Апрель 15, 2010, 18:05
я же написал... у меня линукс

А кстати не проверял какой у тебя searchPaths() по умолчанию? Может это где в настройках Qt, поэтому и результат разный.


Название: Re: Ошибки кроссплатформенности
Отправлено: crossly от Апрель 15, 2010, 19:14
совершенно пустой....


Название: Re: Ошибки кроссплатформенности
Отправлено: Prm от Апрель 16, 2010, 08:55
А если попробовать

if (QFileInfo(qApp->applicationDirPath() + "/LevitationBreathTechnic.htm").exists())
     helpUrl = "\"" + qApp->applicationDirPath() + "/LevitationBreathTechnic.htm" + "\"";

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


Название: Re: Ошибки кроссплатформенности
Отправлено: crossly от Апрель 16, 2010, 12:30
и в чем сокральный смысл кавычек??


Название: Re: Ошибки кроссплатформенности
Отправлено: Prm от Апрель 16, 2010, 13:46
и в чем сокральный смысл кавычек??

Наличие пробелов или русских символов в пути к файлу.

Оговорюсь сразу - ПОД ЛИНУКСОМ НЕ ПРОБОВАЛ. Совет, как говорится, до кучи.

Простой пример. Необходимо из программы запустить другую программу.
Каталог программы C:\Program files\ Папка русскими буквами с пробалами\bin,
Запускаемый файл: prog.exe

QProcess exc;

Первый вариант:

QString prog =  QApplication::applicationDirPath() + "/prog.exe";
...
exc.start(prog);
...
Программа не запускается

Второй вариант:

QString prog =  "\"" + QApplication::applicationDirPath() + "/prog.exe" + "\"";
...
exc.start(prog);
...

Программа УСПЕШНО запущена.






Название: Re: Ошибки кроссплатформенности
Отправлено: AlekseyK от Апрель 17, 2010, 00:43
Вариант имеет право на существование, но костыль, хотя и лучше найденного мной в некоторых случаях.