Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: @!!ex от Февраль 18, 2010, 15:27



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


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: shirushizo от Февраль 18, 2010, 16:50
Сам диалог отображается?


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: @!!ex от Февраль 18, 2010, 16:52
Нет. Диалог не отображается.
FileName просто инициализируется пустой строкой и продолжается выполнение программы.

P.S.
ОС Win XP Pro
компилятор: mingw32
используется динамическая линковка


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: Sancho_s_rancho от Февраль 19, 2010, 20:49
А слот-то этот вообще вызывается?


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: @!!ex от Февраль 19, 2010, 20:50
Да. и getFileOpenDialog тоже вызывается. Только диалог не показывает, а возвращает сразу пустую строку.


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: Sancho_s_rancho от Февраль 19, 2010, 21:03
В примерах, в каталоге dialogs, есть пример standarddialogs где вызывается эта же статическая функция. Он у вас без проблем работает?
Остается ли проблема если вместо 0 передаете родителя this?
На виндовс при использовании статической функции вызывается родной диалог виндов. Остается ли проблема если Qt использует свой (QFileDialog dialog(this); и бла-бла-бла)?


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: @!!ex от Февраль 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 - для нативного диалога роли не играет. одинаково глючит.


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: shirushizo от Февраль 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,...);


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: lit-uriy от Февраль 20, 2010, 08:55
>>1. В винде могут тупить вызовы без объектов QFileDialog::getOpenFileName.
Никогда не наблюдал
>>2. Объект может создаваться и тут же дохнуть (наверно слот завершается быстрее, чем показывается окно, т.е. >> несрабатывает какое-то прерывание/задержка), поэтому лучше пользовать указатели
Вообще чушь, как слот может завершится быстрее, чем выполнится функция QFileDialog::getOpenFileName ???


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: shirushizo от Февраль 20, 2010, 12:32
Вообще чушь, как слот может завершится быстрее, чем выполнится функция QFileDialog::getOpenFileName ???
Чесно говоря не знаю, но было несколько раз такое: окошко диалога моргнуло и все опять фокус на главное окно. Может причина в чем-то другом, но я ее понял имено так:
Создается объект, вызывается метод(собстно оконшко моргнуло) и завершается метод/слот. Выход за область видимости и диалог благополучно умирает. Сама система не ждет выбора файла и нажатия кнопки  :o.
Грешил на кривую сборку Qt и свои кривые руки, но уже у нескольких людей такой глюк и именно под виндой.
Если есть другие идеи относительно возникновения выслущаю и буду благодарен.


Название: Re: Периодически не вызывается диалог в QFileDialog::getOpenFileName
Отправлено: SABROG от Февраль 20, 2010, 14:23
Если есть другие идеи относительно возникновения выслущаю и буду благодарен.

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

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

Может быть дело всё-таки в другом? В том, что передав 0 в качестве родителя диалог появляется позади главного окна и ты его просто не видишь?