Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
1

QDir::currentPath() и непонятное поведение

08.01.2015, 02:24. Показов 6790. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
у меня в программе есть след непонятка:
я читаю файл с настройками(там записаны директории с последними открытыми файлами), потом я открываю эти файлы(они сохраняются в файл настроек при closeEvent(QCloseEvent * event)). Вообщем а дальше у меня из папки с проектом загружаются всякие кнопки итп, и в силу того, что QDir::currentPath() меняется(я так понимаю это потому что я использую QDir в модели данных и просто), ничего естественно не загружается, да и файл с настройками сохраняется не туда. В итоге я в конструкторе сохраняю при открытии QDir::currentPath() , после чего вызываю QDir::setCurrent(beginDirectory);
Это как-то неправильно всё...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2015, 02:24
Ответы с готовыми решениями:

Непонятное поведение QTextEdit
На форме есть QTextEdit сделанный через Qt Creator. Поначалу все работает, текст вводится,...

QDir QDir::Filters
Здраствуйте! Хочу получить список всех файлов в директории за исключением . и .. QStringList...

Непонятное поведение поведение TIM6 на STM32f4discovery
Вводные данные: SYSCLK=168Мгц; AHB Pressotir=1; APB1 Pressotir=4; TIM6_Pessotir=3; Т.о....

Непонятное поведение
Всем привет! В книге "Прата - Язык программирования C++. Лекции и управжения 2011" нашёл вот такой...

34
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
08.01.2015, 14:36 2
Цитата Сообщение от dzrkot Посмотреть сообщение
у меня в программе есть след непонятка:
я читаю файл с настройками(там записаны директории с последними открытыми файлами), потом я открываю эти файлы(они сохраняются в файл настроек при closeEvent(QCloseEvent * event)). Вообщем а дальше у меня из папки с проектом загружаются всякие кнопки итп, и в силу того, что QDir::currentPath() меняется(я так понимаю это потому что я использую QDir в модели данных и просто), ничего естественно не загружается, да и файл с настройками сохраняется не туда. В итоге я в конструкторе сохраняю при открытии QDir::currentPath() , после чего вызываю QDir::setCurrent(beginDirectory);
Это как-то неправильно всё...
Не понимаю ситуацию. Что мешает вместо абсолютных путей использовать относительные?
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
08.01.2015, 18:26  [ТС] 3
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Не понимаю ситуацию. Что мешает вместо абсолютных путей использовать относительные?
....эм...?
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.01.2015, 21:03 4
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
QDir::currentPath() меняется(я так понимаю это потому что я использую QDir в модели данных и просто),
Догадка? А точная причина почему меняется текущая папка?
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
08.01.2015, 22:45  [ТС] 5
Цитата Сообщение от Avazart Посмотреть сообщение
Догадка? А точная причина почему меняется текущая папка?
если бы я знал... у меня ещё не было столько свободного времени, чтобы почитать документацию, а во всяких Шлее и Бланшет я ответа не нашёл, почему оно себя так ведёт я не имею ни малейшего представления..
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.01.2015, 23:49 6
Ну хз тогда что ты там делаешь и что там может быть, ибо ты привел ... кусков кода и .... описание проблемы...
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
09.01.2015, 04:57 7
Цитата Сообщение от dzrkot Посмотреть сообщение
....эм...?
Да, да, именно то самое "эм?", потому как данных ты практически не привёл и остаётся только гадать что там у тебя и почему.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
09.01.2015, 10:59 8
Цитата Сообщение от dzrkot Посмотреть сообщение
у меня ещё не было столько свободного времени, чтобы почитать документацию, а во всяких Шлее и Бланшет я ответа не нашёл
Шлее и Бланшет это выжимка, причем скупая, из документации. Первым делом нужно лезть в доку
0
Поклонник Qt
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
09.01.2015, 11:25 9
Цитата Сообщение от dzrkot Посмотреть сообщение
я так понимаю это потому что я использую QDir в модели данных и просто
Неправильно понимаешь.
QDir сам ничего не меняет.
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
09.01.2015, 15:26 10
Цитата Сообщение от Кудаив Посмотреть сообщение
Шлее и Бланшет это выжимка, причем скупая, из документации. Первым делом нужно лезть в доку
В корне не верно так писать. Шлее и Бланшет дают основы Qt и общее понимание. После их изучения уже можно лезть в доку.
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.01.2015, 15:56 11
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
В корне не верно так писать. Шлее и Бланшет дают основы Qt и общее понимание. После их изучения уже можно лезть в доку.
Согласен, дока это дока, а учебник это учебник.
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
09.01.2015, 16:22 12
dzrkot,
1) не знаю как сейчас у тебя, но вообще для сохранения настроек лучше используй QSettings
2) Если тебе нужна именно папка приложения есть QCoreApplication::​applicationDirPath(), но при деплое под OSX могут быть проблемы (в описании есть)
3) QDir::currentPath даже при старте приложения может отличатся от папки с приложением. (Для проверки запусти приложение из cmd не из текущей папки а из любой другой, прописав полный путь к exe).

Это так, теория.

А по сабжу как быстрый фикс можешь просто перед чтением файлов из папки с проектом и перед записью ini делать
C++ (Qt)
1
QDir::setCurrent(QCoreApplication::applicationDirPath());
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.01.2015, 16:31 13
Цитата Сообщение от arrjj Посмотреть сообщение
1) не знаю как сейчас у тебя, но вообще для сохранения настроек лучше используй QSettings
Именно для этого не советовал бы, файлы станут не человеко-читаемыми если будут содержать ссылки.
Цитата Сообщение от arrjj Посмотреть сообщение
3) QDir::currentPath даже при старте приложения может отличатся от папки с приложением. (Для проверки запусти приложение из cmd не из текущей папки а из любой другой, прописав полный путь к exe).
Это нормальное поведение, с которым нужно считаться.
C++ (Qt)
1
Dir::setCurrent(QCoreApplication::applicationDirPath());
Это не хорошее решение ибо противоречит пункту 3.
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
09.01.2015, 16:49 14
Цитата Сообщение от Avazart Посмотреть сообщение
Именно для этого не советовал бы, файлы станут не человеко-читаемыми если будут содержать ссылки.
Для чего? Для сохранения списка последних открытых каталогов? Почему? Приведи пример.
Цитата Сообщение от Avazart Посмотреть сообщение
Это нормальное поведение, с которым нужно считаться.
Мы то с тобой в курсе, а тс возможно нет, и именно для него я это написал.
Цитата Сообщение от Avazart Посмотреть сообщение
Это не хорошее решение ибо противоречит пункту 3.
Хорошие решения в п.1 и п.2 описаны, а это
Цитата Сообщение от arrjj Посмотреть сообщение
быстрый фикс
. В любом случае это лучше предложенного тобой решения
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.01.2015, 17:00 15
Цитата Сообщение от arrjj Посмотреть сообщение
Для чего? Для сохранения списка последних открытых каталогов? Почему? Приведи пример.
Пример чего? QSettings искажает кириллические символы ( и даже пробел) урл-кодированием.

Добавлено через 51 секунду
Цитата Сообщение от arrjj Посмотреть сообщение
. В любом случае это лучше предложенного тобой решения
Я ничего не предлагал, ибо пока не вижу проблемы.

Добавлено через 5 минут
Цитата Сообщение от arrjj Посмотреть сообщение
Хорошие решения в п.1 и п.2 описаны, а это
По поводу 2 так это тоже что и быстрый фикс.

Если ваша программа запускается из консоли или из другой программы или ярлыком нужно просто позаботится о выставлении рабочей папки, и не привязываться к абсолютным путям.
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
09.01.2015, 17:18 16
Цитата Сообщение от Avazart Посмотреть сообщение
Пример чего? QSettings искажает кириллические символы ( и даже пробел) урл-кодированием.
1) об этом сказано в документации и ничто не мешает utf кодек
2) под виндой стандартный контейнер для QSettings - реестр, как следствие проблема отсутствует
Цитата Сообщение от Avazart Посмотреть сообщение
Я ничего не предлагал, ибо пока не вижу проблемы.
Вот именно
Цитата Сообщение от Avazart Посмотреть сообщение
Если ваша программа запускается из консоли или из другой программы или ярлыком нужно просто позаботится о выставлении рабочей папки, и не привязываться к абсолютным путям.
Что и делает QDir::setCurrent(QCoreApplication::applicationDirPath());
И у ТС'а (насколько понятно из стартпоста) нет привязки к абсолютным путям ему надо загрузить ресурсы относительно папки приложения (п.2) и туда же сохранить настройки
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.01.2015, 17:36 17
arrjj, Через QSettings::setIniCodec ? Сами то пробовали? Оно не помогает, ключи/разделы как и прежде кодируются как и юрл, что не нормально.

Цитата Сообщение от arrjj Посмотреть сообщение
2) под виндой стандартный контейнер для QSettings - реестр, как следствие проблема отсутствует
Записывать списки файлов в реестр?
Цитата Сообщение от arrjj Посмотреть сообщение
относительно папки приложения (п.2)
А папка приложения это не абсолютный путь? В данном случае то что вы называете папкой приложение это папка исполняемого файла, а к ней не стоит привязываться. Вдруг пользователь захочет запускать программу с разными настройками путем смены рабочей папки?
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
09.01.2015, 17:56 18
Цитата Сообщение от Avazart Посмотреть сообщение
что не нормально.
ну не знаю... общего стандарта то нет, кто как хочет так и пишет (касательно Qt). Да и вообще ИМХО задавать настройки кириллицей не есть хорошо.
Цитата Сообщение от Avazart Посмотреть сообщение
Записывать списки файлов в реестр?
Записывать списки последних открытых файлов - вполне норм.
Цитата Сообщение от Avazart Посмотреть сообщение
Вдруг пользователь захочет запускать программу с разными настройками путем смены рабочей папки?
ну а это уже как автор захочет делать
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.01.2015, 18:00 19
Цитата Сообщение от arrjj Посмотреть сообщение
ну не знаю... общего стандарта то нет, кто как хочет так и пишет (касательно Qt).
Не знаю в С++Builder использовал кириллицу не боясь. И что это за решение такое кодировать тектовый формат файла в урл-стиле?
Цитата Сообщение от arrjj Посмотреть сообщение
Да и вообще ИМХО задавать настройки кириллицей не есть хорошо.
Почему нет? А как же интернацианализация?
Цитата Сообщение от arrjj Посмотреть сообщение
ну а это уже как автор захочет делать
А как же пользователи?
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
09.01.2015, 19:18 20
Цитата Сообщение от Avazart Посмотреть сообщение
А как же пользователи?
ИМХО от рабочей папки не должна зависеть работоспособность программы. И конфиги и ресурсы должны быть в одном месте. Если программа в своём концепте предусматривает такую возможность, то обычно ей добавляют необходимые ключи запуска (abc.exe -config="/dev/null").
Текущая рабочая директория естественно должна обрабатываться, но только в тех программах, где это действительно необходимо и оправдано (например ls/dir )
Цитата Сообщение от Avazart Посмотреть сообщение
Почему нет? А как же интернацианализация?
Слабо себе представляю почему в конфиге должны быть ключи не на латинице. Обычно они хардкодятся в приложении. Ну и плюс совместимость с 1-байтовой кодировкой.
Цитата Сообщение от Avazart Посмотреть сообщение
Не знаю в С++Builder использовал кириллицу не боясь. И что это за решение такое кодировать тектовый формат файла в урл-стиле?
это не url-encoding это ascii-encoding \xHHHH - вполне годный способ впихнуть многобайтовую кодировку в однобайтовую. И не стоит этого боятся - Qt всё переконвертит за нас.
0
09.01.2015, 19:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2015, 19:18
Помогаю со студенческими работами здесь

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

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

Непонятное поведение функции
почему-то в функцию handlePlayerInput всегда передаётся true. Почему сам понять не могу //Game.cpp...

Непонятное поведение Скайпа
Три дня назад с моим ноутом начали твориться непонятные вещи. Скайп обычно у меня запускается со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru