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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Периодически не вызывается диалог в QFileDialog::getOpenFileName  (Прочитано 7734 раз)
@!!ex
Гость
« : Февраль 18, 2010, 15:27 »

Вот такой код:
Код:
QString FileName = QFileDialog::getOpenFileName(0,tr("Выберите файл проекта"),"",tr("Проекты локализации (*.lpf)"));
Запускаю приложение - все работает..
Запускаю еще раз - диалог не появляется, FileName==""
Зависимости не нашел. Несколько запусков работает, один-два не работает, потом опять все норм.
в Qt совсем недавно, даже предположить не могу в чем может быть проблема.
Записан
shirushizo
Гость
« Ответ #1 : Февраль 18, 2010, 16:50 »

Сам диалог отображается?
Записан
@!!ex
Гость
« Ответ #2 : Февраль 18, 2010, 16:52 »

Нет. Диалог не отображается.
FileName просто инициализируется пустой строкой и продолжается выполнение программы.

P.S.
ОС Win XP Pro
компилятор: mingw32
используется динамическая линковка
Записан
Sancho_s_rancho
Гость
« Ответ #3 : Февраль 19, 2010, 20:49 »

А слот-то этот вообще вызывается?
Записан
@!!ex
Гость
« Ответ #4 : Февраль 19, 2010, 20:50 »

Да. и getFileOpenDialog тоже вызывается. Только диалог не показывает, а возвращает сразу пустую строку.
Записан
Sancho_s_rancho
Гость
« Ответ #5 : Февраль 19, 2010, 21:03 »

В примерах, в каталоге dialogs, есть пример standarddialogs где вызывается эта же статическая функция. Он у вас без проблем работает?
Остается ли проблема если вместо 0 передаете родителя this?
На виндовс при использовании статической функции вызывается родной диалог виндов. Остается ли проблема если Qt использует свой (QFileDialog dialog(this); и бла-бла-бла)?
Записан
@!!ex
Гость
« Ответ #6 : Февраль 20, 2010, 00:49 »

Примеры тестировать пока некогда.
Создал QFileDialog dialog(this);
работает стабильно. Единственное - тормозит при запуске.
Отображается окно, потом секунд 5 думает.
Код:
    QFileDialog dialog(this);
    dialog.setFileMode(QFileDialog::QFileDialog::ExistingFile);
    dialog.setFilter(tr("Проекты локализации (*.lpf)"));
    QString FileName;
    if (dialog.exec())
        FileName = dialog.selectedFiles()[0];
В целом меня такое поведение устраивает, т.к. диалог довольно редко вызывается.
Но все таки хотелось бы узнать почему WinAPI диалог не пашет. Грустный

UPD:
0 или this - для нативного диалога роли не играет. одинаково глючит.
Записан
shirushizo
Гость
« Ответ #7 : Февраль 20, 2010, 08:18 »

1. В винде могут тупить вызовы без объектов QFileDialog::getOpenFileName.
2. Объект может создаваться и тут же дохнуть (наверно слот завершается быстрее, чем показывается окно, т.е. несрабатывает какое-то прерывание/задержка), поэтому лучше пользовать указатели 
С родителем:
Код:
QFileDialog* mdialog= new QFileDialog;
QString filename = mdialog->getOpenFileName(this,...);
или без родителя:
Код:
QFileDialog* mdialog= new QFileDialog;
mdialog->setAttribute(Qt::WA_DeleteOnClose,true);
QString filename = mdialog->getOpenFileName(0,...);
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Февраль 20, 2010, 08:55 »

>>1. В винде могут тупить вызовы без объектов QFileDialog::getOpenFileName.
Никогда не наблюдал
>>2. Объект может создаваться и тут же дохнуть (наверно слот завершается быстрее, чем показывается окно, т.е. >> несрабатывает какое-то прерывание/задержка), поэтому лучше пользовать указатели
Вообще чушь, как слот может завершится быстрее, чем выполнится функция QFileDialog::getOpenFileName Непонимающий
Записан

Юра.
shirushizo
Гость
« Ответ #9 : Февраль 20, 2010, 12:32 »

Вообще чушь, как слот может завершится быстрее, чем выполнится функция QFileDialog::getOpenFileName Непонимающий
Чесно говоря не знаю, но было несколько раз такое: окошко диалога моргнуло и все опять фокус на главное окно. Может причина в чем-то другом, но я ее понял имено так:
Создается объект, вызывается метод(собстно оконшко моргнуло) и завершается метод/слот. Выход за область видимости и диалог благополучно умирает. Сама система не ждет выбора файла и нажатия кнопки  Шокированный.
Грешил на кривую сборку Qt и свои кривые руки, но уже у нескольких людей такой глюк и именно под виндой.
Если есть другие идеи относительно возникновения выслущаю и буду благодарен.
Записан
SABROG
Гость
« Ответ #10 : Февраль 20, 2010, 14:23 »

Если есть другие идеи относительно возникновения выслущаю и буду благодарен.

Такое может происходить только в одном случае - класс на базе QDialog создается на стеке (не через new) и затем используется метод show()/open() вместо exec().

Запускаю еще раз - диалог не появляется, FileName==""

Может быть дело всё-таки в другом? В том, что передав 0 в качестве родителя диалог появляется позади главного окна и ты его просто не видишь?
« Последнее редактирование: Февраль 20, 2010, 14:33 от SABROG » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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