Название: как закрыть 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) Вроде работает. Только окно сохранения кутешное. Название: 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 ос, ну либо делать как я. |