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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятное поведение программы.  (Прочитано 7186 раз)
Мурат
Гость
« : Июль 30, 2007, 14:53 »

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

Заранее спасибо!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Июль 30, 2007, 15:23 »

Ты можешь дето выложить код?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
SABROG
Гость
« Ответ #2 : Июль 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
Записан
Мурат
Гость
« Ответ #3 : Июль 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
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Август 01, 2007, 10:34 »

2 Мурат: Нужно было последовать совету SABROG. Проблема решилась при помощи установки флага

Цитировать

app.setQuitOnLastWindowClosed(false);


app - QApplication
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Мурат
Гость
« Ответ #5 : Август 01, 2007, 14:49 »

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

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

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

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

Всем спасиба!!! Показает язык
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Август 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, действительно все корректно работает.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #7 : Декабрь 26, 2008, 12:48 »

А в QT3.3.8

setQuitOnLastWindowClosed()

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

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

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

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

Как мало времени и как много нужно узнать
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Декабрь 26, 2008, 12:54 »

В Qt3 обычно руками соединяли сигнал lastWindowClosed() и слот quit().

Поведение для меня очень странное, закиньте багу троллям и сюда её номер, будет интересно её отследить.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Декабрь 26, 2008, 17:05 »

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

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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #10 : Декабрь 26, 2008, 23:14 »

Немного поэкспериментировал...

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

configDLG = new fConfig(0,0);

валилось.

Сделал

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

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

Записан

Как мало времени и как много нужно узнать
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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