Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Hellenna от Декабрь 01, 2005, 16:12



Название: QFileDialog: выделение файлов и папок
Отправлено: Hellenna от Декабрь 01, 2005, 16:12
Приветстую всеx.
Сорри за долгое отсутсвие - перемены в жизни. :)

вопрос: qt-3.3.3, как сделать так, чтобы используя QFileDialog можно было выделять и файлы И папки? а то ExistingFiles дает выделять только файлы, Directory - только папки, объединить их не получается... :(
Может есть какой-нибудь другой компонент, который разрешает делать это?


Название: QFileDialog: выделение файлов и папок
Отправлено: zlatko от Декабрь 01, 2005, 16:46
сори за любопытнось но мне на ум не приходит ситуация в которой через QFileDialog нужно выбырать и файлы и папки :roll:


Название: QFileDialog: выделение файлов и папок
Отправлено: Hellenna от Декабрь 02, 2005, 10:18
Цитата: "zlatko"
сори за любопытнось но мне на ум не приходит ситуация в которой через QFileDialog нужно выбырать и файлы и папки :roll:

программа архиватор - надо добавлять записи в архив, можно добавить как файлы, так и целые каталоги. Удобно дать пользователю возможность выбрать их за один раз в одном диалоге ;)


Название: QFileDialog: выделение файлов и папок
Отправлено: Dendy от Декабрь 02, 2005, 20:54
А нету такого в QFileDialog (что есть странно). Решение могу подсказать следующее:

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

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


 :D


Название: QFileDialog: выделение файлов и папок
Отправлено: Hellenna от Декабрь 04, 2005, 16:04
Цитата: "Dendy"
А нету такого в QFileDialog (что есть странно). Решение могу подсказать следующее

не очень поняла суть :( можно или более подробный код или просто объяснить принцип?


Название: QFileDialog: выделение файлов и папок
Отправлено: Dendy от Декабрь 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 :D  Сподіваюсь що допоможе, якщо ні - запитуйте, завжди раді допомогти!


Название: QFileDialog: выделение файлов и папок
Отправлено: Hellenna от Декабрь 06, 2005, 15:32
Цитата: "Dendy"

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

Спасибо за помощь. Попробую что получится. :)


Название: QFileDialog: выделение файлов и папок
Отправлено: Hellenna от Декабрь 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езультатом стали две кнопки одна на добавление файлов, другая на добавление каталогов... :(


Название: QFileDialog: выделение файлов и папок
Отправлено: Dendy от Декабрь 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 в данном случае ненужна.


Название: QFileDialog: выделение файлов и папок
Отправлено: Hellenna от Декабрь 14, 2005, 14:35
Цитата: "Dendy"
f.setFileMode( ExistingFiles );

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

Может все наши проблемы от того что у тебя судя по заголовкам qt4, а у меня 3.5?


Название: QFileDialog: выделение файлов и папок
Отправлено: Dendy от Декабрь 15, 2005, 17:29
Значит проблема в том, что ни при каких настройках не получается вьlделить одновременно папку и файл или папку и папку? Хммм... В Qt4 можно, но если при ентом нажать на "Открьlть" - зайдёт в первую из вьlделенньlх папок. Вопчем, советую дебажить исходники Qt ;)