2012-05-16 4 views
2

Я пытаюсь реализовать эффект mouseover в Qt, но я не знаю, как использовать обработчики событий. Я создал простое приложение Qt Widget с помощью pushButton. Я могу связать обработчик события к MainWindow так:Обработчики событий в Qt

MainWindow::enterEvent(QEvent *event) 
{ 
    ui->pushButton_3->setGraphicsEffect(effect); 
} 

Это работает, то graphicsEffect применяется к розжига. Но я не понимаю, как привязать обработчик события к одному QObject. Насколько я знаю, невозможно использовать сигналы, потому что они поддерживают только события кликов и события mouseover.

Я довольно новичок в Qt, и я не смог найти никакой информации, которую я мог бы понять.

Может ли кто-нибудь объяснить мне, как связать обработчик событий с одним объектом QObject?

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

+1

В Qt вы действительно не привязываете обработчики событий. Вы просто повторно реализуете методы в подклассе, чтобы сделать что-то новое. Кроме того, классы QObject имеют сигналы по умолчанию, с которыми они были разработаны, но вы можете испускать свои собственные пользовательские сигналы и подключаться к ним. – jdi

+0

Как я могу исправить эти пользовательские сигналы? (Я новичок) – Qurben

+2

Возможно, вам просто нужно прочитать базовый учебник, чтобы получить основы: http://sector.ynet.sk/qt4-tutorial/how-to-read-qt-documentation-basic-concepts.html , Там также есть отличные книги. – jdi

ответ

3

Я понял это, по-другому, с помощью опции «Содействие в ...» в QtCreator , Как также описано здесь: http://sector.ynet.sk/qt4-tutorial/customing-widgets.html

Я добавил класс «MyPushButton":

mypushbutton.h

#ifndef MYPUSHBUTTON_H 
#define MYPUSHBUTTON_H 

#include <QPushButton> 
#include <QGraphicsDropShadowEffect> 

class MyPushButton : public QPushButton 
{ 
    Q_OBJECT 
public: 
    MyPushButton(QWidget *parent = 0); 

private: 
    void enterEvent(QEvent *e); 
    void leaveEvent(QEvent *e); 

    QGraphicsDropShadowEffect *effect; 
}; 

#endif // MYPUSHBUTTON_H 

MyPushButton.каст

#include "mypushbutton.h" 

MyPushButton::MyPushButton(QWidget *parent) 
    :QPushButton(parent) 
{ 
    effect = new QGraphicsDropShadowEffect(); 
    effect->setBlurRadius(5); 
    effect->setEnabled(false); 
    this->setGraphicsEffect(effect); 
} 

void MyPushButton::enterEvent(QEvent *event) 
{ 
    if (this->isEnabled()) 
     effect->setEnabled(true); 
} 

void MyPushButton::leaveEvent(QEvent *event) 
{ 
    if (this->isEnabled()) 
     effect->setEnabled(false); 
} 

, а потом я сразу же щелкнул QPushButton в редакторе и я выбрал «Продвижение к ...», и я добавил MyPushButton как «продвигаемых имя класса».

Он работает как шарм и очень легко расширяется или настраивается, поскольку он работает с любым событием.

+0

Выглядит хорошо! Это очень разумный способ решения вашей проблемы, и ваш ответ очень ясен. – cgmb

1

Если вы работаете с QPushButton, это описано очень хорошо здесь:

http://www.developer.nokia.com/Community/Wiki/How_to_use_QPushButton_in_Qt

Для входа и выхода события, смотрите здесь: Finding current mouse position in QT

Если, например, вы делаете что-то который наследует от QGraphicsRectItem, вы можете переопределить событие мыши, как это:

class BTNodeGraphicsItem : public QGraphicsRectItem 
{ 
protected: 
    virtual void mousePressEvent(QGraphicsSceneMouseEvent* event); 
    // other class stuff 
}; 

Тогда

void BTNodeGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent* event) 
{ 
    // do stuff here 
} 

Если вы хотите, чтобы событие идти дальше, то вы добавить

QGraphicsRectItem::mousePressEvent(event); 

в обработчику.

+0

Я не совсем понимаю, должен ли я создать новый класс, который наследует QPushButton и добавит туда код? И как бы добавить этот новый QPushButton в свой MainWindow? – Qurben

+0

Вы не сказали, что у вас есть реальный QPushButton в вашем вопросе. Ответ отредактирован. – Almo

+0

В примере я использовал pushButton. Я также заявил, что мне нужен эффект mouseover, с enterEvent и leaveEvent, или что-то еще. Насколько я знаю, это невозможно при стандартных сигналах – Qurben

1

Если вы хотите указать поведение, зависящее от событий для QWidgets без подклассификации каждого из них, можно использовать фильтры событий. Создайте фильтр событий, как описано Qt's documentation, и примените его к виджетам, о которых идет речь.

Я написал простой пример ниже, но обратите внимание, что использование фильтров таким образом становится все более сложным, когда вы начинаете иметь несколько взаимодействующих действий. Я считаю, что они наиболее эффективны для простых действий, которые необходимо применять во многих видах виджетов.

class WidgetHoverEffectEnabler : public QObject 
{ 
Q_OBJECT 
public: 
    WidgetHoverEffectEnabler(QObject* parent); 

    virtual bool eventFilter(QObject* obj, QEvent* e); 
}; 

WidgetHoverEffectEnabler::WidgetHoverEffectEnabler(QObject* parent) 
: QObject(parent) 
{ 
} 

bool WidgetHoverEffectEnabler::eventFilter(QObject* obj, QEvent* e) 
{ 
    if(QWidget* widget = qobject_cast<QWidget*>(obj)) 
    { 
     QGraphicsEffect* effect = widget->graphicsEffect(); 
     if(effect) 
     { 
     if(e->type() == QEvent::Enter) 
     { 
      effect->setEnabled(true); 
     } 
     else if(e->type() == QEvent::Leave) 
     { 
      effect->setEnabled(false); 
     } 
     } 
    } 
    return QObject::eventFilter(obj, e); 
} 

Затем вы можете установить этот фильтр на виджеты во время их инициализации:

// works on your button 
QPushButton* button = new QPushButton; 
QGraphicsDropShadowEffect* dropShadowEffect = new QGraphicsDropShadowEffect; 
dropShadowEffect->setEnabled(false); 
button->setGraphicsEffect(dropShadowEffect); 
button->installEventFilter(new WidgetHoverEffectEnabler(button)); 

// works on any widget 
QLabel* label = new QLabel("Read me!"); 
QGraphicsBlurEffect* blurEffect = new QGraphicsBlurEffect; 
blurEffect->setEnabled(false); 
label->setGraphicsEffect(blurEffect); 
label->installEventFilter(new WidgetHoverEffectEnabler(label)); 
Смежные вопросы