Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Day от Январь 13, 2012, 10:34



Название: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 10:34
приобрел книжицу Макс Шлее Qt4.5+дистрибутив с примерами.
Начал примерчики делать. Поздоровался. Сделал 2 виджетика "сигнал-слот" Все путем.
Перешел к части 5.
Код:
#include <QtGui>
// --------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget      wgt;

    QWidget* pwgt2 = new QWidget(&wgt);
    QPalette pal2;
    pal2.setBrush(pwgt2->backgroundRole(), QBrush(QPixmap("stone.jpg")));
    pwgt2->setPalette(pal2);
    pwgt2->resize(100, 100);
    pwgt2->move(75, 75);
    pwgt2->setAutoFillBackground(true);

    wgt.resize(200, 200);
    wgt.show();

    return app.exec();
}
По идее должен появляться квадрат, усеянный камнями. Нету. Голый wgt
stone.jpg в папке присутствует. В чем дело?
Там еще был pwgt1 - голубой квадрат (я его выкинул из кода) - вот он появлялся.
Почему принимаются картинки только в стиле Малевича? :)
В той же главе 5 еще 2 проекта - MouseCursor, ScrollArea использующие картинки.
Тоже картинок нет.
Компутер - Настольный PC, Windows XP


Название: Re: Начало работы с Qt
Отправлено: Bepec от Январь 13, 2012, 10:44
Может у тебя просто палитра удаляется при выходе из процедуры? :D

Создай её тоже динамически, как и виджет, аля

Код:
 QPalette* pal2 = new QPalette();
   pal2->setBrush(pwgt2->backgroundRole(), QBrush(QPixmap("stone.jpg")));

И посмотри что получится. :)

ждусь результатов.


Название: Re: Начало работы с Qt
Отправлено: andrew.k от Январь 13, 2012, 11:48
в какой папке у тебя присутствует stone.jpg? Там где исходники?
Обрати внимание откуда запускается твоя программа.


Название: Re: Начало работы с Qt
Отправлено: stima от Январь 13, 2012, 11:49
Создание обьекта динамически или статически тут роли совершенно не играет.

Код:
#include <QtGui/QApplication>
#include <QtGui>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QPixmap pixmap;

    qDebug() << "By relative path. Is load: " << pixmap.load("myFile.jpg");
    qDebug() << "By absolute path. Is load: " << pixmap.load("C:\\MyDir\\myFile.jpg");

    return app.exec();
}

И вывод в студию.


Название: Re: Начало работы с Qt
Отправлено: Bepec от Январь 13, 2012, 12:13
Приведенный пример полностью рабочий :)

Сделай проще - картинку скопируй в корень диска "С:\" допустим.
И путь к ней укажи полный "С:\stone.jpg".



Название: Re: Начало работы с Qt
Отправлено: andrew.k от Январь 13, 2012, 12:26
Ошибку свою понял, заметив main ;)
А сначала в приведенном коде ты не заметил main?  ;D

... но main тут тоже не при чем. "А мужики-то не знали" )


Название: Re: Начало работы с Qt
Отправлено: Пантер от Январь 13, 2012, 12:41
Пиплы.... Дружно рубим свой офтоп.


Название: Re: Начало работы с Qt
Отправлено: andrew.k от Январь 13, 2012, 12:44
Да. Видимо у меня аллергия на херню.
Может ты еще к ТС домой приедешь и за него все сделаешь?

Суть проблемы какбэ сразу очевидна (надеюсь : )

Я бы мог написать "скопируй файл в каталог сборки", он бы это сделал и может и не понял ничего и на этом успокоился и забыл через 5 минут.
А так бы он повозился немного, раз сразу не получилось, и что-то понял, так как проблема не стоит и выеденного яйца.

Это ^ тоже офтоп?


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 12:58
Ребята, не ссорьтесь, пожалуйста, а то мне как-то неудобно. Только пришел на форум, и тут такую бучу поднял!
Приведенный пример полностью рабочий :)
Сделай проще - картинку скопируй в корень диска "С:\" допустим.
И путь к ней укажи полный "С:\stone.jpg".
Вот так все работает! Спасибо!
в какой папке у тебя присутствует stone.jpg? Там где исходники?
Обрати внимание откуда запускается твоя программа.
Да! Там где исходники. И exe там же!
Так какую папку Qt считает текущей? Какую-то свою? И как тогда понять папку экзэшника? В Borland Builder я знаю как, есть там такая АПИ, не помню навскидку как зовут.
А если под Линуксом - тогда как? Это же все должно быть кроссплатформенно, за этим и шел. Там даже палки не такие!
ЗЫ. Запускал прямо из Qt. Пока с ДЛЛ не разобрался.
Пока топчу первые грабли.


Название: Re: Начало работы с Qt
Отправлено: Bepec от Январь 13, 2012, 13:02
Код:
QApplication::applicationDirPath () 
вернет тебе папку, откуда запущена программа :)

А насчёт бучи не беспокойся. Это просто андрев.к нервничает при виде меня ^^

PS andrew.k чтобы узнать и понять проблему с путями, нужно сначала её решить. Можно одному, а можно спросить. В 1 случае зазря потеряешь время(1 функция в глубинах qApplication), во 2 экономия времени :)


Название: Re: Начало работы с Qt
Отправлено: Bepec от Январь 13, 2012, 13:15
stima, а если пользоваться VS2008, то она сначала ищет в папке с иходниками, а только после этого в дебаге (ну релиз соответственно сам у себя ищет, никуда не заглядывая.)


Название: Re: Начало работы с Qt
Отправлено: kambala от Январь 13, 2012, 13:28
для хранения разнообразных ресурсов можно (и лучше?) пользоваться файлом ресурсов *.qrc. Это обычный текстовый файл, в который добавляются пути к файлам (для удобного добавления с Qt идёт небольшая утилита). зато потом в коде пути к ним можно использовать относительные, например: QPixmap(":/stone.jpg").

В книжке наверное дальше об этом будут рассказывать :)


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 13:36
stima,
Цитировать
Day я лично сомневаюсь, что у тебя .exe был в папке с исходниками, если ты конечно не переписывал .pro файл.
И это не "недочет Qt" это просто не понимание, что происходит.
Ничего я не переписывал. В pro:
Win32:TARGET=..\ScrollArea
.exe точно в этой же папке. И по времени смотрел - тот самый.
Но тут дело значительно хужее.
Переписал я в папку с исходниками и exe библиотечки mingwm10, qtcore4, qtgui4.dll, чтоб значит, независимым быть.
Запускаю - нет картинки! И с jpg в корне, и в текущей.
Выкинул библиотеки. Запуск из Qt с картинкой в корне - все Ок!
Ладно, чуть попозже попробую с applicationDirPath, но вообще-то мне это начинает не нравится.
Правда, библиотеки я брал с предыдущей установки Qt, но с того же дистрибутива и по дате-размеру они совпадают


Название: Re: Начало работы с Qt
Отправлено: Bepec от Январь 13, 2012, 13:46
Вы прежде чем независимым быть, спросили бы у людей, а что нужно с собой брать.

Идите в папку Qt "C:\Qt\4.7.2\plugins\imageformats\".

Идетё в папку со своей программой, и копируете туда  "imageformats\qjpeg4.dll" - каталог там должен быть именно с таким названием. А в нём dll.

Это позволяет использовать формат jpeg для картинок.

PS а я начал уважать png. Для него вроде кодеки ненужны :D


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 13:48
Переписал библиотеки из последней поставки - все Ok!
Будем считать это глюком.
Но при картинке в текущей директории запуск из Qt ее не видит.
А если тупо запустить экзэшник - все хорошо.


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 13:53
Верес,
Цитировать
Это позволяет использовать формат jpeg для картинок.
ИМХО, он же формат jpeg и без этой либы понимает. Когда находит - прекрасно рисует. Вот только находит не всегда.


Название: Re: Начало работы с Qt
Отправлено: _OLEGator_ от Январь 13, 2012, 13:55
to Bepec
не совсем верно, при запуске из под студии ищет относительно файла проекта


Название: Re: Начало работы с Qt
Отправлено: Aluman от Январь 13, 2012, 14:01
Проекты->Настройки сборки.
Там есть галочка Теневая сборка.
Если она не установлена, то у тебя будет только одна папка, которая и будет текущей.
Если галочка установлена, то текущей будет папка указанная в соот поле. При этом экзешники будут находится в поддиректориях release и debug, для релизной и дебажной сборки соответственно.

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


Название: Re: Начало работы с Qt
Отправлено: Bepec от Январь 13, 2012, 14:09
Day а ты попробуй удали эту папочку с плагинами. Посмотришь как у тебя он будет воспринимать :D

Когда ты запускаешь программу на своём компьютере, она ищет по путям и находит плагины. Соответственно картинка показывается.

Когда ты запустишь программу на компьютере без этих плагинов (или удалишь их из папочки Qt). То картинка у тебя будет пустым обычным виджетом.


to OLEGator спасибо за поправку, буду знать ^^


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 14:15
Ресурсы - это конечно здорово! Сразу снимает кучу проблем. Но вот что делать, если я хочу предоставить юзеру возможность самому выбрать картинку? Не говоря уж о том, что картинка может создаваться динамически.
Но дело не в этом. Меня интересует механизм поиска файлов. Ведь не только картинки я буду искать. Там и базы данных будут, а уж в ресурс никак не засунешь
Ну, вот теперь знаю, что с Qt в этом смысле надо ухо держать востро.
И за это всем спасибо!


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 14:25
Цитировать
Aliman, Проекты->Настройки сборки.
Там есть галочка Теневая сборка.
Не нашел такой галочки, увы! Но в папке debug вообще пусто, а в release одинокий main.o
И экзешник точно в исходной папке. Клянусь! Я ж его запускаю без оболочки Qt. И никаких проблем. Не считая 20 Мб библиотек. Но это уже будет другая тема.


Название: Re: Начало работы с Qt
Отправлено: kambala от Январь 13, 2012, 15:00
Ресурсы - это конечно здорово! Сразу снимает кучу проблем. Но вот что делать, если я хочу предоставить юзеру возможность самому выбрать картинку? Не говоря уж о том, что картинка может создаваться динамически.
Но дело не в этом. Меня интересует механизм поиска файлов. Ведь не только картинки я буду искать. Там и базы данных будут, а уж в ресурс никак не засунешь
Ну, вот теперь знаю, что с Qt в этом смысле надо ухо держать востро.
И за это всем спасибо!
когда пользователь выбирает файл/папку, в программе доступны полные пути, с которыми нет никаких проблем. а про QCoreApplication::applicationDirPath() уже говорили.


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 18:58
Все понятно.
Код:
    qDebug() << "Dir of EXE:" << QApplication::applicationDirPath();  // Без палки
    qDebug() << "Path of EXE:" << QApplication::applicationFilePath();  // Полное имя exe
    char b[200];
    getcwd(b, 198);
    qDebug() << "Current Dir (getcwd):" << b;
А вот вывод
Код:
Запускается H:\QtExamp\chapter05\ScrollArea\ScrollArea.exe...
Dir of EXE: "H:/QtExamp/chapter05/ScrollArea"
Path of EXE: "H:/QtExamp/chapter05/ScrollArea/ScrollArea.exe"
Current Dir (getcwd): H:\QtExamp\chapter05\ScrollArea\release
И палки в разные стороны...
Но хорошо, что научился пользоваться qDebug()


Название: Re: Начало работы с Qt
Отправлено: kambala от Январь 13, 2012, 19:30
"палки", называемые слэшами, в коде Qt-приложений надо использовать всегда только прямые - /

исключение составляет лишь использование windows api при написании windows-only кода, а также обращение к виндовому реестру через QSettings (может есть еще какие-то моменты, о которых я не знаю) - там надо использовать нативные обратные слэши \, которые в строке надо экранировать другим обратным слэшем.


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 13, 2012, 20:03
"палки", называемые слэшами, в коде Qt-приложений надо использовать всегда только прямые - /

исключение составляет лишь использование windows api при написании windows-only кода, а также обращение к виндовому реестру через QSettings (может есть еще какие-то моменты, о которых я не знаю) - там надо использовать нативные обратные слэши \, которые в строке надо экранировать другим обратным слэшем.
Это все, конечно, чрезвычайно радует. Как вы сказали? "кроссплатформенность"
Кстати, когда я задавал полный путь своим картинкам, пришлось использовать экранированные обратные слэши, прямые были проигнорированы.


Название: Re: Начало работы с Qt
Отправлено: Авварон от Январь 13, 2012, 22:08
"палки", называемые слэшами, в коде Qt-приложений надо использовать всегда только прямые - /

Можно писать абсолютно любые слэши - хоть "C:\\folder\\/folder/file.txt"
Внутри себя Qt уже преобразует это к виду "C:/folder/folder/file.txt" независимо от платформы и уберет все двойные слеши. См. QDir::cleanPath()


Название: Re: Начало работы с Qt
Отправлено: LisandreL от Январь 13, 2012, 22:23
исключение составляет лишь использование windows api при написании windows-only кода
WinAPI прекрасно работает с прямыми слешами.


Название: Re: Начало работы с Qt
Отправлено: kambala от Январь 13, 2012, 22:52
сколько всего нового можно узнать за день :)


Название: Re: Начало работы с Qt
Отправлено: andrew.k от Январь 13, 2012, 22:55
Проверил, даже в командной строке виндус работают прямые слеши.

Код
Bash
C:\>cd dev/projects
 
C:\dev\projects>


Название: Re: Начало работы с Qt
Отправлено: Day от Январь 14, 2012, 11:52
Проверил, даже в командной строке виндус работают прямые слеши.

Код
Bash
C:\>cd dev/projects
 
C:\dev\projects>
Вы правы. Они не работают только для некоторых старинных версий command.com, но это можно уже в расчет не принимать. А если у меня они где-то задействованы, ну что ж, это лично моя вина.
Всем спасибо!


Название: Re: Начало работы с Qt
Отправлено: lit-uriy от Январь 15, 2012, 16:13
прямые слеши ещё криво работают при указании диска:
D://tram-pam-pam


Название: Re: Начало работы с Qt
Отправлено: andrew.k от Январь 15, 2012, 16:46
прямые слеши ещё криво работают при указании диска:
D://tram-pam-pam
может потому что прямой слеш не нужно дублировать?
хотя должно и с дублированием работать.


Название: Re: Начало работы с Qt
Отправлено: kambala от Январь 15, 2012, 18:08
на 7 с дублированием работает
Код:
C:\Windows\system32>cd C://Qt

C:\Qt>cd ..

C:\>cd C:/Qt

C:\Qt>_