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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFileDialog: выделение файлов и папок  (Прочитано 10718 раз)
Hellenna
Гость
« : Декабрь 01, 2005, 16:12 »

Приветстую всеx.
Сорри за долгое отсутсвие - перемены в жизни. Улыбающийся

вопрос: qt-3.3.3, как сделать так, чтобы используя QFileDialog можно было выделять и файлы И папки? а то ExistingFiles дает выделять только файлы, Directory - только папки, объединить их не получается... Грустный
Может есть какой-нибудь другой компонент, который разрешает делать это?
Записан
zlatko
Гость
« Ответ #1 : Декабрь 01, 2005, 16:46 »

сори за любопытнось но мне на ум не приходит ситуация в которой через QFileDialog нужно выбырать и файлы и папки :roll:
Записан
Hellenna
Гость
« Ответ #2 : Декабрь 02, 2005, 10:18 »

Цитата: "zlatko"
сори за любопытнось но мне на ум не приходит ситуация в которой через QFileDialog нужно выбырать и файлы и папки :roll:

программа архиватор - надо добавлять записи в архив, можно добавить как файлы, так и целые каталоги. Удобно дать пользователю возможность выбрать их за один раз в одном диалоге Подмигивающий
Записан
Dendy
Гость
« Ответ #3 : Декабрь 02, 2005, 20:54 »

А нету такого в QFileDialog (что есть странно). Решение могу подсказать следующее:

Код:
class MyFileDialog : public QFileDialog
{
..
void accept(); // <= virtual
..
};

void MyFileDialog::accept()
{
  QStringList files = selectedFiles(); // тута ваши файлики
..
  // если всё так:
  QDialog::accept();
  // если чё не так:
  QFileDialog::accept();
}


 Веселый
Записан
Hellenna
Гость
« Ответ #4 : Декабрь 04, 2005, 16:04 »

Цитата: "Dendy"
А нету такого в QFileDialog (что есть странно). Решение могу подсказать следующее

не очень поняла суть Грустный можно или более подробный код или просто объяснить принцип?
Записан
Dendy
Гость
« Ответ #5 : Декабрь 05, 2005, 14:17 »

Ну принцёп такой, что для задач, не подходящих под статические функции ( ::question(), ::information() etc. ) есть возможность наследуясь от QFileDialog получить более широкие возможности. Например - получение файлов и папок. В enum QFileDialog::FileMode нету чего-то вроде AnyFileOrDirectory. Поєтому делаем так как я привёл вьlше. Метод accept() виртуальньlй, исполнен он будет при нажатии кнопки Ок или как она там звётся. Собственно, переопределяя его и получаем наши вьlделенньlе файлики с папочками с помощью selectedFiles(). А там уже сами решаем, что с ними делать.

Есть вариант обозвать енто статической функцией:

Код:
class MyFileDialog
{
public:
  static QStringList getFilesAndDirectories( ... );
};

void MyFileDialog::accept()
{
  QDialog::accept();
}

QStringList MyFileDialog::getFilesAndDirectories( ... )
{
  MyFileDialog fd( ... );
  fd.exec();
  return fd.selectedFiles();
}


А вообще - рьlться в исходниках QFileDialog Веселый  Сподіваюсь що допоможе, якщо ні - запитуйте, завжди раді допомогти!
Записан
Hellenna
Гость
« Ответ #6 : Декабрь 06, 2005, 15:32 »

Цитата: "Dendy"

А вообще - рьlться в исходниках QFileDialog Веселый  Сподіваюсь що допоможе, якщо ні - запитуйте, завжди раді допомогти!

Спасибо за помощь. Попробую что получится. Улыбающийся
Записан
Hellenna
Гость
« Ответ #7 : Декабрь 08, 2005, 18:21 »

Цитата: "Dendy"


Есть вариант обозвать енто статической функцией:


может чего не так сделала, но:
Код:


class FilesDirsDialog:public QFileDialog
{
    Q_OBJECT;
    public:
   FilesDirsDialog(const QString & dirName, const QString & filter =      QString::null, QWidget * parent = 0, const char * name = 0, bool modal = FALSE );
            static QStringList getFilesAndDirs( const QString & filter = QString::null, const QString & dir = QString::null, QWidget * parent = 0, const char * name = 0, const QString & caption = QString::null, QString * selectedFilter = 0, bool resolveSymlinks = TRUE);
    private slots:
            virtual void accept();
};

FilesDirsDialog::FilesDirsDialog(const QString & dirName, const QString & filter, QWidget * parent, const char * name, bool modal ):
                    QFileDialog(dirName, filter, parent, name, modal) {

}
void FilesDirsDialog::accept(){
    QDialog::accept();
}

QStringList FilesDirsDialog::getFilesAndDirs( const QString & filter, const QString & dir, QWidget * parent, const char * name, const QString & caption, QString * selectedFilter = 0, bool resolveSymlinks){
    FilesDirsDialog dlg(dir, filter, parent, name, false);
    dlg.setCaption(caption);
    dlg.setSelectedFilter(filter);
//без этой строчки вообще ничего не хотело выделяться, и кнопка Ok возвращала пустой список
    dlg.setMode(QFileDialog::ExistingFiles);
    dlg.exec();
    return dlg.selectedFiles();
}



как не выделялись файлы и каталоги, так и не выделяются...
попробовала поковырять исходними QFileDialog, в течении 20 минут найти концы не смогла, больше времени не было. Pезультатом стали две кнопки одна на добавление файлов, другая на добавление каталогов... Грустный
Записан
Dendy
Гость
« Ответ #8 : Декабрь 09, 2005, 18:00 »

Вот попробовал сам сделать. Пример короче некуда. Всё чудесно работает:

Код:
#include <QApplication>
#include <QFileDialog>

class F : public QFileDialog
{
public:
static QStringList get();

F();

void accept();
};

F::F()
{
}

void F::accept()
{
QDialog::accept();
}

QStringList F::get()
{
F f;
f.setFileMode( ExistingFiles );
f.exec();
return f.selectedFiles();
}

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

QStringList sl = F::get();
for ( QStringListIterator it( sl ); it.hasNext(); )
{
QString s = it.next();
int y = 0; // <- це для брікпоінту (0:
}

return 0;
}


Пост Скріптум.

Навскидку.

Есть такая штука - порядок выполнения конструкторов, создавая слот в порождённом окне не получится сконнектить его из конструктора базового типа, ибо послений ничего не знает о предпоследнем..... тьху... о порождённом, о! Посему братья-близнецы QFileDialog::accept() и FilesDirsDialog::accept() (у тебя) всего-лишь однофамильцы - это два разных метода. QFileDialog благополучно сконнектится в конструкторе к своему слоту. Твой вьlполнится только потому, что он виртуальньl, но никак не из-за того, что он обьявлен как public slots:. Посему, всякая мета-информация вместе с Q_OBJECT в данном случае ненужна.
Записан
Hellenna
Гость
« Ответ #9 : Декабрь 14, 2005, 14:35 »

Цитата: "Dendy"
f.setFileMode( ExistingFiles );

Попробовла (взяла твой код и засунула в прогу). точно также благополучно выделяются либо один файл, либо один каталог, а мне надо несколько Грустный

Может все наши проблемы от того что у тебя судя по заголовкам qt4, а у меня 3.5?
Записан
Dendy
Гость
« Ответ #10 : Декабрь 15, 2005, 17:29 »

Значит проблема в том, что ни при каких настройках не получается вьlделить одновременно папку и файл или папку и папку? Хммм... В Qt4 можно, но если при ентом нажать на "Открьlть" - зайдёт в первую из вьlделенньlх папок. Вопчем, советую дебажить исходники Qt Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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