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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt 4.2.2] Что использовать для выбора имени директории?  (Прочитано 11734 раз)
Tamara
Гость
« : Август 09, 2007, 08:11 »

Задача: нужен путь для сохранения пакета документов (нескольких файлов с общим именем).
Хочется, чтобы выглядело это так:
Открывается диалог выбора файла. Текущая директория Мои документы. В строке ввода имени файла по умолчанию введено некое Имя_Пакета (заранее заданное).
При нажатии на "Открыть" (Сохранить, Ок... Короче, "Выбрать") возвращается путь к выбранной папке (т.е. если пользователь не менял ничего, то C:\Documents and Settings\UserName\Мои документы/Имя_Пакета), независимо от того создана она или нет.

Варианты решения (в tpath полный путь к Мои документы/Имя_Пакета):
Код:

1.  tpath = QFileDialog::getSaveFileName(0,
                      'Выберите путь для сохранения пакета',
                      tpath, QString(), QString(),
                      QFileDialog::ShowDirsOnly));
   
2.  tpath = QFileDialog::getExistingDirectory(0,
                      'Выберите путь для сохранения пакета',
                      tpath, QFileDialog::ShowDirsOnly))

В первом случае проблема: если папка уже существует, то выбрать ее нельзя.
Во втором: невозможно задать имя создаваемой папки по умолчанию (т.е. к несозданной папке путь он не вернет, надо там дополнительно на кнопку Создать папку нажимать и имя руками вводить).
Как добиться желаемого?
Записан
-=QT=-
Гость
« Ответ #1 : Август 09, 2007, 09:09 »

Проверять существует ли папка.
Это есть в QFileInfo.
И если нет то предлагать создать папку или выбрать уже существующую. Тоесть стандартный алгоритм. :wink:
Записан
Tamara
Гость
« Ответ #2 : Август 09, 2007, 10:08 »

Проблема собственно в этом: как реализовать "предлагать создать папку или выбрать уже существующую" удобным для пользователя образом. Если использовать для этого диалог выбора существующей директории, то невозможно задать имя по умолчанию (а в большинстве случаев, пользователя бы это имя устроило). Т.е. либо надо создавать папку до открытия диалога и выделять ее в диалоге (это криво, т.к. может пользователь захочет сохранить пакет в другое место), либо пользователю всегда придется нажимать на "Создать папку" и вводить ее имя.
В случае с getSaveFileName невозможно выбрать уже созданную папку.
Проблема собственно в том, что хотелось бы работать с папкой как с файлом (то что называется шаблон composite), а как это сделать непонятно. Т.е. при выборе куда сохранить файл все понятно: можно ввести новое имя можно выбрать существующий файл и переписать его. Когда директория является своего рода "файлом" (единой сущностью, пакетом документов) хотелось бы примерно того же.

добавлено спустя 5 минут:

 Во! Придумала пример. Хочу диалог как в некоторых инсталляторах: сверху окошко выбора существующей директории, снизу поле для ввода имени новой папки (если не введено сохраняет в выбранную). Есть ли что-нить такое в Qt? Или все вручную писать?
Записан
-=QT=-
Гость
« Ответ #3 : Август 09, 2007, 10:20 »

Алгоритм:
1. Перед выводом формы о сохранении файла
Код:
QFileDialog::getSaveFileName ....

проверяем существует ли путь по умолчанию, для сохранения тоесть:
         а) если он есть то папку для сохранения выводим в диалоге сохранения файла см. п 1 .
         б) если его нет то выводим сообщение, что папка по умолчанию для
сохранения файла отсутствует и проедлагаем вариант - создать папку
по умолчанию (ту которую Мы хотим), если пользователь отказался то
выводим форму сохранения файла см. п 1 в корневой дирректории (или с
другими вариантами).

ИМХО мой вариант.  Крутой

P. S. Я бы в таком случае  сохранял бы значение папки по умолчанию. Вдруг  пользователь изменит ее на собственную, а каждый раз указывать нудно  Веселый
Записан
Tamara
Гость
« Ответ #4 : Август 09, 2007, 10:42 »

Видимо у меня с объясняловкой совсем туго сегодня... Я несколько не то имела ввиду.
Пункт а) невозможен. Если папка есть, то выбрать ее при помощи диалога сохранения файла в Qt невозможно (иначе и проблемы бы не было). Только при помощи getExistingDirectory.
В моем случае, самой папки по умолчанию в большинстве случаев не существует. Поясню задачу: в программе есть сущность "пакет документов", у него есть номер и дата, его можно сохранить в папку ввиде нескольких файлов. При сохранении, по умолчанию, предлагается сохранить в папку, например, с именем "Мои документы/Номер_пакета Дата_пакета", должна быть простая возможность этот путь менять. Эта папка может существовать на момент сохранения или нет - не важно. Как при сохранении обычного файла.
Ладно, видимо все-таки стандартными средствами Qt это не делается... Просто в какой-то другой библиотеке когда-то встречала, и подумала - а вдруг тут тоже есть...
Записан
-=QT=-
Гость
« Ответ #5 : Август 09, 2007, 11:09 »

а) невозможен. Если папка есть, то выбрать ее при помощи диалога сохранения файла в Qt невозможно (иначе и проблемы бы не было).

Код:
void QFileDialog::setDirectory ( const QString & directory )
Sets the file dialog's current directory.
See also directory().

void QFileDialog::setDirectory ( const QDir & directory )
This is an overloaded member function, provided for convenience.
Записан
Tamara
Гость
« Ответ #6 : Август 09, 2007, 11:55 »

Вот что значит велик и могуч... Выбрать не в смысле показать в диалоге, а в смысле, чтоб функция getSaveFileName вернула путь к созданной папке.
Функция setDirectory устанавливает текущую директорию для диалога сохранения файлов. Это все замечательно. Но дело в том, что именно выбрать ее нельзя. Попытаюсь объяснить максимально подробно. В этом диалоге нельзя выполнить сценарий: выбираем созданную директорию, жмем сохранить и в качестве результата выполнения функции получаем путь к этой директории. Там вообще нельзя нажать сохранить, если в поле ввода имени файла не написано ничего (а в случае использования setDirectory именно так и получается), так как это диалог выбора имени  файла.
Правду говорю. Честно-честно :wink:
Записан
-=QT=-
Гость
« Ответ #7 : Август 09, 2007, 12:12 »

Верю - верю  :mrgreen:
Ну тогда писать собственную реализацию. И проще и функциональнее.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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