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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как закрыть QFileDialog ?  (Прочитано 5968 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Ноябрь 20, 2013, 14:36 »

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

 void   reject ()?

Вроде публичный.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Ноябрь 20, 2013, 14:45 »

Да, но она не срабатывает, да и не может сработать, смотрю исходники ф-ции getSaveFileName. Они внутри нее создают еще один экземпляр  QFileDialog  o_O Посему придется как то по другому дергать сохранение файлов.
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 20, 2013, 21:47 »

Посмотрю завтра. Мож чего нарою.

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

PS извиняюсь если сказал глупость ^.^
« Последнее редактирование: Ноябрь 20, 2013, 21:54 от Bepec » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Ноябрь 21, 2013, 12:51 »

я так понимаю Вы вызываете диалог так:
if(fileDialog->exec()==QDialog::Accepted) ?
Если так, то может есть смысл вызвать через show(), так как этот вызов неблокируемый. А так же задать какой то сигнал, привязать его к слоту close() диалога и дергать где то извне?
Записан
Bepec
Гость
« Ответ #5 : Ноябрь 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();
}

Вроде работает. Только окно сохранения кутешное.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #6 : Ноябрь 26, 2013, 16:41 »

Сделал все немного по другому. Проблема состояла в том, что показывать нужно было обязательно нативное окно ОС. Если посмотреть код вызова этого окна в Qt то станет ясно, что убрать его сможет только пользователь, программного этого не добиться. Посему я у себя просто храню статус окна, видно его сейчас или нет и если видно, то не даю программе выполнять никаких действий, что бы не "подвесить" софт.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Ноябрь 26, 2013, 21:12 »

смотрю исходники ф-ции getSaveFileName. Они внутри нее создают еще один экземпляр  QFileDialog  o_O
Не ещё один, а просто один.
Это ж статическая функция. Она про ваш экземпляр ничегошеньки не знает.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 28, 2013, 09:14 »

Такие ф-ции как accept и done вызвать нельзя ибо они объявлены как protected.
А унаследоваться?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #9 : Ноябрь 28, 2013, 09:32 »

Не ещё один, а просто один.
Это ж статическая функция. Она про ваш экземпляр ничегошеньки не знает.

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

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

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


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