Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Мурат от Июля 30, 2007, 14:53



Название: Непонятное поведение программы.
Отправлено: Мурат от Июля 30, 2007, 14:53
Ситуация такая: есть главное окно реализуемое классом MyWin наследуемым от QMainWindow. В одном из методов этого класса создается таймер, который просто через определенные промежутки времени показывает MessageBox. Проблема в том что если вызвать метод hide() главного окно то после очередного показа MessageBox приложение закрывается полность, чего не происходит если главное окно не прятать. В чем может быть проблема и как её можно исправить?

Заранее спасибо!


Название: Непонятное поведение программы.
Отправлено: pastor от Июля 30, 2007, 15:23
Ты можешь дето выложить код?


Название: Непонятное поведение программы.
Отправлено: SABROG от Июля 30, 2007, 15:44
Возможно дело в этом:

Код:

app.setQuitOnLastWindowClosed(true);


Судя по написанному:

Цитировать

bool QWidget::close ()   [slot]
Closes this widget. Returns true if the widget was closed; otherwise returns false.
First it sends the widget a QCloseEvent. The widget is hidden if it accepts the close event. If it ignores the event, nothing happens. The default implementation of QWidget::closeEvent() accepts the close event.
If the widget has the Qt::WA_DeleteOnClose flag, the widget is also deleted. A close events is delivered to the widget no matter if the widget is visible or not.
The QApplication::lastWindowClosed() signal is emitted when the last visible primary window (i.e. window with no parent) with the Qt::WA_QuitOnClose attribute set is closed. By default this attribute is set for all widgets except transient windows such as splash screens, tool windows, and popup menus.


Я делаю вывод, что закрытие окна равносильно хайду, если не указано иное - Qt::WA_DeleteOnClose


Название: Непонятное поведение программы.
Отправлено: Мурат от Июля 31, 2007, 14:50
Не думаю что дело в этих флагах. Если просто без таймера вызвать MessageBox после hide() окна, то ничего такого не просиходит.


Цитировать
Ты можешь дето выложить код?


Заголовочный файл
Код:

#include <QtGui/QMessageBox>
#include <QtGui/QMainWindow>
#include "ui_test2.h"

class test2 : public QMainWindow
{
Q_OBJECT
public:
test2(QWidget *parent = 0, Qt::WFlags flags = 0)
:QMainWindow(parent, flags)
{
ui.setupUi(this);
}
~test2(){};

private:
Ui::test2Class ui;

private slots:
void getNewItems()
{
QMessageBox::warning(0,"","");
}
};


и main.cpp
Код:

#include <QtGui/QApplication>
#include <QtCore/QTimer>
#include "test2.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
test2 w;
w.show();

QTimer *timer = new QTimer(&w);
a.connect(timer, SIGNAL(timeout()), &w, SLOT(getNewItems()));
timer->start(10000);

w.hide();
//w.getNewItems();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
return a.exec();
}


Даже если MessageBox присвоить родителя this, тот же самый результат!


Название: Непонятное поведение программы.
Отправлено: pastor от Августа 01, 2007, 10:34
2 Мурат: Нужно было последовать совету SABROG. Проблема решилась при помощи установки флага

Цитировать

app.setQuitOnLastWindowClosed(false);


app - QApplication


Название: Непонятное поведение программы.
Отправлено: Мурат от Августа 01, 2007, 14:49
У меня этот флаг не меняет поведение программы, поэтому я и написал что дело не в этих флагах.Я пробовал разные флаги но результат один и тот же. А у тебя прога уже не завершается?

добавлено спустя 24 минуты:

 Вот блин затупил  :oops:

Решил как и говорили с помощью app.setQuitOnLastWindowClosed(false);

Всем спасиба!!! :P


Название: Непонятное поведение программы.
Отправлено: pastor от Августа 02, 2007, 09:29
Это оказался баг в 4.2.3 (я тестил на ней). Вот что говорят троли:

Цитировать

This is actually a bug in Qt 4.2.3 which has been fixed for Qt 4.3.0.
If you upgrade to this version then it should resolve the problem for
you.

 
Попробывал на 4.3.0, действительно все корректно работает.


Название: Re: Непонятное поведение программы.
Отправлено: Примерный ученик от Декабря 26, 2008, 12:48
А в QT3.3.8

setQuitOnLastWindowClosed()

не существует!!!

Что делать?
Ситуация аналогичная. Как только в дополнительном окне, при скрытом
главном вызываю

   QMessageBox::critical( this,"Ошибка","Проверьте данные!");

приложение закрывается!!!


Название: Re: Непонятное поведение программы.
Отправлено: Alex Custov от Декабря 26, 2008, 12:54
В Qt3 обычно руками соединяли сигнал lastWindowClosed() и слот quit().

Поведение для меня очень странное, закиньте багу троллям и сюда её номер, будет интересно её отследить.


Название: Re: Непонятное поведение программы.
Отправлено: pastor от Декабря 26, 2008, 17:05
Поведение для меня очень странное, закиньте багу троллям и сюда её номер, будет интересно её отследить.

Эта проблема уже известна тролям. В какой-то версии Qt4 уже исправили.

ЗЫ: Для Qt3 врядли они приймут баг репорт


Название: Re: Непонятное поведение программы.
Отправлено: Примерный ученик от Декабря 26, 2008, 23:14
Немного поэкспериментировал...

Пока создавал форму

configDLG = new fConfig(0,0);

валилось.

Сделал

configDLG = new fConfig(0,0,false,0x00000200 | 0x00000400);

и стало нормально!