Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt]QCloseEvent в консоли 
:(
    Опции темы
CompWorm
Дата 14.6.2010, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



доброго времени!

вопрос про консольное приложение qt

*.h
Код

#include <QCloseEvent>
class MY: public QObject
{
    Q_OBJECT
public:
    MY();

protected:
    void closeEvent(QCloseEvent *event);
...

*.cpp
Код

void MY::closeEvent(QCloseEvent *event)
{
qDebug() << "done!";
}

говорит, что не может найти <QCloseEvent>. удалил строчку из файла проекта
QT -= gui
заработало, но событие не ловит.
при закрытии крестиком пишет 
Цитата

exited with code -1073741510

если остановить из qt, то
Цитата

exited with code -3


как узнать, что консоль закрыли?

Это сообщение отредактировал(а) CompWorm - 14.6.2010, 21:16


--------------------
PM MAIL   Вверх
SABROG
Дата 15.6.2010, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



closeEvent() метод класса QWidget, а не QObject. Прервать выход из QCoreApplication нельзя, но можно узнать когда этот выход происходит по сигналу QCoreApplication::aboutToQuit() или просто повесить нужно действие после того как QCoreApplication::exec() вернет управление. При необходимости запустить снова exec(). Если нужно что-то подчистить в момент вызова деструктора QCoreApplication (как правило перед выходом из самой программы), то функция qAddPostRoutine().

Это сообщение отредактировал(а) SABROG - 15.6.2010, 08:18


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
CompWorm
  Дата 15.6.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



Цитата(SABROG @  15.6.2010,  08:18 Найти цитируемый пост)
closeEvent() метод класса QWidget, а не QObject.

а.. тогда понятно почему не работает)))

хорошо, тогда я пробую отловить сигнал aboutToQuit() 
примерно так:
Код

MY::MY()
{
QObject::connect(QCoreApplication::instance(),SIGNAL(aboutToQuit()),this,SLOT(beforeQuit()));
}

void MY::beforeQuit()
{
qDebug() << "Done!";
}

нет эффекта... 

Цитата(SABROG @  15.6.2010,  08:18 Найти цитируемый пост)
просто повесить нужно действие после того как QCoreApplication::exec() вернет управление. 

не очень удобное решение...
так не хочет:
Код

{
    QCoreApplication a(argc, argv);

    //кодеровка для всего приложения

    int i = a.exec();
    qDebug() << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
    return i;
}


меня ещё волнует вопрос с деструктором основного класса - он почему-то игнорируется...

Это сообщение отредактировал(а) CompWorm - 15.6.2010, 14:28


--------------------
PM MAIL   Вверх
SABROG
Дата 16.6.2010, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(CompWorm @  15.6.2010,  14:21 Найти цитируемый пост)
нет эффекта... 

Цитата(CompWorm @  15.6.2010,  14:21 Найти цитируемый пост)
так не хочет

Цитата(CompWorm @  15.6.2010,  14:21 Найти цитируемый пост)
вопрос с деструктором основного класса - он почему-то игнорируется

Значит что-то делаешь не так.

// test.pro

Код

TARGET = test
TEMPLATE = app
SOURCES += main.cpp
HEADERS += main.cpp
CONFIG += console


//main.cpp
Код

#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtCore/QTimer>

class MyObject : public QObject
{
    Q_OBJECT
public:
    MyObject(QObject* parent = 0) : QObject(parent)
    {
        QObject::connect(qApp, SIGNAL(aboutToQuit()), SLOT(onQuit()));
    }
    ~MyObject()
    {
        qDebug() << Q_FUNC_INFO;
    }

public slots:
    void onQuit()
    {
        qDebug() << Q_FUNC_INFO;
    }
};

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    MyObject mo;
    QTimer::singleShot(0, qApp, SLOT(quit()));
    a.exec();
    qDebug() << Q_FUNC_INFO;

    return 0;
}

#include "moc_main.cpp"





Это сообщение отредактировал(а) SABROG - 16.6.2010, 11:19


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
CompWorm
Дата 27.6.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



ну по этому коду у меня куча вопросов.
1) это
Код

QTimer::singleShot(0, qApp, SLOT(quit()));

не совсем честно. тут событие генерируется искусственно внутри приложения и приложение это событие чудненько ловит, а при нажатии крестика ничего не срабатывает.

2) эту запись
Код

MyObject(QObject* parent = 0) : QObject(parent)

не понял... почему так?


--------------------
PM MAIL   Вверх
SABROG
Дата 28.6.2010, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(CompWorm @  27.6.2010,  12:17 Найти цитируемый пост)
не совсем честно. тут событие генерируется искусственно внутри приложения и приложение это событие чудненько ловит, а при нажатии крестика ничего не срабатывает.

В линуксе вообще не создается никакого консольного окна. Как предлагаешь организовать одинаковое поведение программ под разными платформами?

Цитата(CompWorm @  27.6.2010,  12:17 Найти цитируемый пост)
не понял... почему так? 

А почему нет?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
CompWorm
Дата 28.6.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



Цитата(SABROG @  28.6.2010,  11:08 Найти цитируемый пост)
В линуксе вообще не создается никакого консольного окна. Как предлагаешь организовать одинаковое поведение программ под разными платформами?

смешно, но если (в винде) нажать Ctrl+C, чему есть аналоги и в линукс и в других операционках, то приложением генерируется код завершения, как я писал выше... то есть оно знает когда его завершают  smile по-другому циклично работающее консольное приложение и не завершишь...


--------------------
PM MAIL   Вверх
SABROG
Дата 29.6.2010, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(CompWorm @  28.6.2010,  22:09 Найти цитируемый пост)
смешно, но если (в винде) нажать Ctrl+C, чему есть аналоги и в линукс и в других операционках, то приложением генерируется код завершения

Это SIGINT в линуксе. Придется делать дополнительные телодвижения, чтобы ловить этот сигнал, как советовал wasyota:

Код

#include <QApplication>                                                                                               
#include <QPushButton>                                                                                                
#include <QtDebug>                                                                                                    
#include <signal.h>                                                                                                   


class Button : public QPushButton {
  Q_OBJECT
public slots:
  void doSomething() { qDebug() << "About to quit!"; }
};

#include "main.moc"

void signalhandler(int sig){
  if(sig==SIGINT){
    qApp->quit();
  }
}

int main(int argc, char **argv){
  QApplication app(argc, argv);
  Button button;
  button.setText("Click me");
  QObject::connect(&app, SIGNAL(aboutToQuit()), &button, SLOT(doSomething()));
  QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(quit()));
  button.show();
  signal(SIGINT, signalhandler);
  return app.exec();
}


Но советую почитать этот тред, чтобы понять почему это плохая идея: http://lists.trolltech.com/qt-interest/200...ead01070-0.html

http://www.zemris.fer.hr/predmeti/os1/misc/Unix2Win.htm


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0746 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.