Russian Qt Forum
Ноябрь 26, 2024, 09:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFileDialog и его статические функции под Windows  (Прочитано 4944 раз)
Yuriy
Гость
« : Октябрь 06, 2011, 12:03 »

Всем привет !

Раньше не так обращал внимание, но теперь пытаюсь разобраться. При использовании getExistingDirectory, getOpenFileName, getOpenFileNames и getSaveFileName в домашней папке Documents and Settings создается директория ?377№?73 такого типа, если профиль назван русскими буквами. А также постоянно выводится ошибка о том что такой каталог не найден. Если создавать диалоги с использованием QFileDialog* newDialog = new QFileDialog; тогда проблема исчезает. Оно и понятно:

вот что говорит ассистент:
On Windows, Mac OS X and Symbian^3, this static function will use the native file dialog and not a QFileDialog.

Кстати говоря, при использовании некоторых плагинов Opera тоже создается такая папка с кривым именем в Documents and Settings.

Может быть у кого-нибудь есть готовый case для этой проблемы или лучше переписать все диалоги с использованием QFileDialog Непонимающий
Записан
blood_shadow
Гость
« Ответ #1 : Октябрь 06, 2011, 19:09 »

а просто сделать:

Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForLocale();
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForTr(codec);
 
?
Записан
Yuriy
Гость
« Ответ #2 : Октябрь 07, 2011, 03:54 »

Почему то настораживает меня использование QTextCodec. Легко понять почему. 2 года веду свои проекты и уже отладил в целом. А теперь после этой надстройки я так понимаю поплывут все преобразования QString. Там же у меня БД SQlite3 и вообще много работы проделано. Сейчас установлю QTextCodec и начнутся то там то здесь непредвиденные ошибки. То что раньше преобразовывалось в Latin1 string начнет плыть и вести не как хотелось бы.

Переписал 17 диалогов. Все решилось.
Записан
blood_shadow
Гость
« Ответ #3 : Октябрь 07, 2011, 11:46 »

ну не знаю, по моему это ксотыль, с самого начала задать и больше не мучаться, у самого
есть программа с БД MySQL но так все в юникоде и проблем нет никаких
Записан
Yuriy
Гость
« Ответ #4 : Октябрь 07, 2011, 15:23 »

Сразу не знал. Кстати говоря, диалог выбора каталогов встроенный в Qt гораздо удобнее:

Код:
    QFileDialog *aDialog = new QFileDialog(this,QString::fromUtf8("Выберите папку для временных файлов..."),QDir::tempPath());
    aDialog->setFileMode(QFileDialog::DirectoryOnly);
    const int ret = aDialog->exec();

    const QStringList fileNames = aDialog->selectedFiles();

    delete aDialog; //чуть не забыл

    QString file ( (ret == QDialog::Accepted && !fileNames.isEmpty() )? fileNames[0] : QString::null);

Он не такой кривой, как я думал раньше, а гораздо удобнее штатного списка папок.
К тому же аналогичный диалог для всех платформ и для Linux и МакОС.
« Последнее редактирование: Октябрь 07, 2011, 15:25 от Yuriy » Записан
blood_shadow
Гость
« Ответ #5 : Октябрь 07, 2011, 15:39 »

у тебя после этого
Код:
delete aDialog; //чуть не забыл
программа норм завершается?
ты задал родителя диалогу, а потом удаляешь, после этого когда будет вызываться "parent" твоего
диалога он еще раз попробует удалить твой диалог, но на этот раз в своем деструкторе...
Записан
Yuriy
Гость
« Ответ #6 : Октябрь 07, 2011, 17:03 »

В этом весь прикол и заключается. Как ни странно, если я вместо this укажу 0 для QAction, тогда valgrind ругается на memory leak, а если указать this, тогда действительно для QAction срабатывает деструктор. Но не для QFileDialog. Если не вызывать delete при каждом диалоге тогда будут memory leak, либо можно определить его как static и не создавать его каждый раз и он будет удален, если будет прописан в секции private.

Выяснил случайно, у меня есть диалог на базе QFileDialog, в котором я добавил дополнительный Layout с просмотром картинок, checkBox'aми и прочими прелестями жизни. Такой диалог весил ~5Мб и после 10 раз использования вес аппликации вырастал на 50 Мб соответственно. Опять же почему под Linux не вся память возвращается. Но и не занимается больше при новых включениях. Какая оптимизация? Но в Windows XP это четко срабатывает. malloc, realloc, free все прозрачно.
« Последнее редактирование: Октябрь 07, 2011, 17:08 от Yuriy » Записан
blood_shadow
Гость
« Ответ #7 : Октябрь 07, 2011, 17:05 »

В этом весь прикол и заключается. Как ни странно, если я вместо this укажу 0 для QAction, тогда valgrind ругается на memory leak, а если указать this, тогда действительно для QAction срабатывает деструктор. Но не для QFileDialog. Если не вызывать delete при каждом диалоге тогда будут memory leak, либо можно определить его как static и не создавать его каждый раз и он будет удален, если будет прописан в секции private.
это странно как-то... а "parent" правильно удаляется?
Записан
Yuriy
Гость
« Ответ #8 : Октябрь 07, 2011, 17:08 »

Абсолютно !
Записан
BRE
Гость
« Ответ #9 : Октябрь 07, 2011, 17:42 »

это странно как-то... а "parent" правильно удаляется?
Это нормально. Улыбающийся
При удалении объект выписывается из списка parent.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.147 секунд. Запросов: 21.