Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ZIkos от Ноябрь 28, 2007, 15:38



Название: Как отловить нажатие [x]?
Отправлено: ZIkos от Ноябрь 28, 2007, 15:38
Скажите пожалуйста как отловить нажатие
  • на QDockWidget.
Есть такой код
QDockWidget *pDistribPanel = m_pShell->CreatePanel("uid1", tr("Имя панели"));

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


Название: Re: Как отловить нажатие [x]?
Отправлено: Lion от Ноябрь 28, 2007, 15:48
QCloseEvent + eventFilter тебе в руки.


Название: Re: Как отловить нажатие [x]?
Отправлено: Dodge от Ноябрь 28, 2007, 16:00
QCloseEvent + eventFilter тебе в руки.
Уточню, есть два варианта:
1. Если вы хотите отловить закрытие виджета написанного вами, то достаточно переопределить метод - closeEvent
2. Установить фильтр на события и отслеживать его закрытие.


Название: Re: Как отловить нажатие [x]?
Отправлено: ZIkos от Ноябрь 28, 2007, 17:10
Не могли бы вы привести пример, как польоваться QCloseEvent  для произвольного виджета


Название: Re: Как отловить нажатие [x]?
Отправлено: fanat9 от Ноябрь 28, 2007, 17:12
\examples\desktop\systray\


Название: Re: Как отловить нажатие [x]?
Отправлено: pastor от Ноябрь 28, 2007, 17:13
Не могли бы вы привести пример, как польоваться QCloseEvent  для произвольного виджета


В своем классе наследнике перегружаешь метод  closeEvent(QCloseEvent *event) и в немже выполняем нужные действия. Далее читаем в ассистанте про QCloseEvent



Название: Re: Как отловить нажатие [x]?
Отправлено: Dodge от Ноябрь 28, 2007, 20:02
В своем классе наследнике перегружаешь метод  closeEvent(QCloseEvent *event) и в немже выполняем нужные действия. Далее читаем в ассистанте про QCloseEvent
Опять же уточню, во втором случае, в первую очередь нада смотреть не QCloseEvent, а эвент филтер(eventFilter).


Название: Re: Как отловить нажатие [x]?
Отправлено: Alex03 от Ноябрь 29, 2007, 07:46
Не могли бы вы привести пример, как польоваться QCloseEvent  для произвольного виджета


Код:
void СSomeWidget::closeEvent(QCloseEvent * e)
{
    if(CanCloseWidget(?))
    {
        ...
        QBaseWidget::closeEvent(e);
        ...
    }
    else
    {
        e->ignore();
    }
}


Название: Re: Как отловить нажатие [x]?
Отправлено: ZIkos от Ноябрь 29, 2007, 11:59
Всем спасибо. Как отловить closeEvent у своего собственного класса, который является наследником от QWidget я понял.
Но как отловить его у экзепляра класса QDockWidget *pDock1 = new QDockWidget?


Название: Re: Как отловить нажатие [x]?
Отправлено: Barmaglodd от Ноябрь 29, 2007, 12:02
QObject::installEventFilter в помощь.
Создаешь наследника от QObject, в нем перекрываешь eventFilter(тут ловишь QCloseEvent), и устанавливаешь его фильтром на pDock1.


Название: Re: Как отловить нажатие [x]?
Отправлено: ZIkos от Ноябрь 29, 2007, 12:09
Большое спасибо. Был бы очень благодарен если бы вы привели пример кода.  ;)


Название: Re: Как отловить нажатие [x]?
Отправлено: Barmaglodd от Ноябрь 29, 2007, 12:12
А в ассистанте не пробовали смотреть? ;)
Кусок оттуда :)
Код:
//Сам фильтр

     class KeyPressEater : public QObject
     {
         Q_OBJECT
         ...

     protected:
         bool eventFilter(QObject *obj, QEvent *event);
     };

     bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
     {
         if (event->type() == QEvent::KeyPress) {
             QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
             qDebug("Ate key press %d", keyEvent->key());
             return true;
         } else {
             // standard event processing
             return QObject::eventFilter(obj, event);
         }
     }

//Устанавливаем

     KeyPressEater *keyPressEater = new KeyPressEater(this);
     QPushButton *pushButton = new QPushButton(this);
     QListView *listView = new QListView(this);

     pushButton->installEventFilter(keyPressEater);
     listView->installEventFilter(keyPressEater);



Название: Re: Как отловить нажатие [x]?
Отправлено: ZIkos от Ноябрь 29, 2007, 12:16
Только что посмотрел. Спасибо. 8)