Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Ноябрь 20, 2013, 14:36



Название: как закрыть QFileDialog ?
Отправлено: ecspertiza от Ноябрь 20, 2013, 14:36
Проблема достаточно банальная, нужно закрыть QFileDialog который был вызван с помощью ф-ции getSaveFileName. Я понимаю, что после вызова этой ф-ции диалог заблокирует работу в главном треде, но пользователь может произвести некоторые действия (например клик по иконке в трее), что вызовет определенные функции в программе, но так как главный трэд занет диалогом они не будут выполнены и у пользователя возникает ощущение того, что софт повис. Хочется закрывать автоматически QFileDialog в этом случае. Такие ф-ции как accept и done вызвать нельзя ибо они объявлены как protected. Тогда я пошел на хитрость и объявил QFileDialog в куче, что бы в нужный момент удалить QFileDialog. Но и тут чудо, экземпляр класса удаляется, но окно все равно открыто. Возникает вопрос, как таки можно закрыть это окошко программно ?


Название: Re: как закрыть QFileDialog ?
Отправлено: Bepec от Ноябрь 20, 2013, 14:43
 void   reject ()?

Вроде публичный.


Название: Re: как закрыть QFileDialog ?
Отправлено: ecspertiza от Ноябрь 20, 2013, 14:45
Да, но она не срабатывает, да и не может сработать, смотрю исходники ф-ции getSaveFileName. Они внутри нее создают еще один экземпляр  QFileDialog  o_O Посему придется как то по другому дергать сохранение файлов.


Название: Re: как закрыть QFileDialog ?
Отправлено: Bepec от Ноябрь 20, 2013, 21:47
Посмотрю завтра. Мож чего нарою.

Просмотрел на скорую исходники - вам надо использовать не статическую функцию, а просто передать те же параметры что и в статической функции.

PS извиняюсь если сказал глупость ^.^


Название: Re: как закрыть QFileDialog ?
Отправлено: Fregloin от Ноябрь 21, 2013, 12:51
я так понимаю Вы вызываете диалог так:
if(fileDialog->exec()==QDialog::Accepted) ?
Если так, то может есть смысл вызвать через show(), так как этот вызов неблокируемый. А так же задать какой то сигнал, привязать его к слоту close() диалога и дергать где то извне?


Название: Re: как закрыть QFileDialog ?
Отправлено: Bepec от Ноябрь 21, 2013, 13:11
Код:
tempFileDialog::tempFileDialog(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);

dialog_ = new QFileDialog(this, "caption", ".", "*.*");
dialog_->setAcceptMode(QFileDialog::AcceptSave);

QTimer::singleShot(3000, this, SLOT(timeout()));
if (dialog_->exec() == QDialog::Accepted)
{
qDebug() << dialog_->selectedFiles();
}
}

void tempFileDialog::timeout()
{
dialog_->reject();
}

Вроде работает. Только окно сохранения кутешное.


Название: Re: как закрыть QFileDialog ?
Отправлено: ecspertiza от Ноябрь 26, 2013, 16:41
Сделал все немного по другому. Проблема состояла в том, что показывать нужно было обязательно нативное окно ОС. Если посмотреть код вызова этого окна в Qt то станет ясно, что убрать его сможет только пользователь, программного этого не добиться. Посему я у себя просто храню статус окна, видно его сейчас или нет и если видно, то не даю программе выполнять никаких действий, что бы не "подвесить" софт.


Название: Re: как закрыть QFileDialog ?
Отправлено: LisandreL от Ноябрь 26, 2013, 21:12
смотрю исходники ф-ции getSaveFileName. Они внутри нее создают еще один экземпляр  QFileDialog  o_O
Не ещё один, а просто один.
Это ж статическая функция. Она про ваш экземпляр ничегошеньки не знает.


Название: Re: как закрыть QFileDialog ?
Отправлено: Igors от Ноябрь 28, 2013, 09:14
Такие ф-ции как accept и done вызвать нельзя ибо они объявлены как protected.
А унаследоваться?


Название: Re: как закрыть QFileDialog ?
Отправлено: ecspertiza от Ноябрь 28, 2013, 09:32
Не ещё один, а просто один.
Это ж статическая функция. Она про ваш экземпляр ничегошеньки не знает.

Да, все верно, не так выразился.

А унаследоваться?

Как показала практика, толку с этого не будет. Если я унаследуюсь, то максимум, что смогу сделать - файл диалог Qt.  А нужен нативный как не крути. А нативный диалог этими функциями не закроешь. Тут либо свой класс диалога сочинять, который будет дергать api ос, ну либо делать как я.