Qtのカスタムイベント

転送:https://blog.csdn.net/douzhq/article/details/80209601

1、カスタムイベントのステップ

時には、開発する必要が、我々は特定の目的を完了するために、イベントをカスタマイズしたいです。次のようにカスタムイベントを実装するための手順は以下のとおりです。

  • 継承QEvent
  • イベントのタイプを定義(QEvent :: UserとQEvent :: MaxUserの間の値を、我々は推奨registerEventType()関数は、自動的に重複防止し、イベントのグローバル一意1型を作成します)
  • イベントを送信するためのSendEvent()またはpostEvent()を使用します
  • あなたは、カスタムクラスのオーバーライドはQObjectにカスタムイベントを処理する必要があります::イベント()メソッド

2、カスタムイベントクラス

カスタムイベントクラスのコードは次の通りである:
ヘッダ

// -------------------------- 自定义事件 --------------------------------
class CustomerEvent : public QEvent
{
public:
    CustomerEvent(QString valueString = "");
    ~CustomerEvent();

    static Type eventType();
    QString getValueString(void);

private:
    static Type m_EventType;
    QString m_String;
};

ソース・ファイル

QEvent::Type CustomerEvent::m_EventType = QEvent::None;

CustomerEvent::CustomerEvent(QString valueString) : QEvent(eventType())
{
    m_String = valueString;
}

CustomerEvent::~CustomerEvent()
{

}

QEvent::Type CustomerEvent::eventType()
{
    // 创建事件Type
    if (m_EventType == QEvent::None)
        m_EventType = (QEvent::Type)QEvent::registerEventType();

    return m_EventType;
}

QString CustomerEvent::getValueString(void)
{
    return m_String;
}

これは、イベントの種類を作成するためにCustomerEvent :: eventTypeを()関数を使用しています。

3、イベントを送信

イベントを送信するには、2つの方法があり、一つのSendEvent()関数を使用することで、postEvent()関数を使用することです。

1)のSendEvent方法

SendEvent()メソッドは、オブジェクトを返すために、プロセスの終了を待って、イベントオブジェクトを送信し、ブロックされています。次のように関数のプロトタイプは次のとおりです。

static bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event); 
参数: receiver为接受事件的对象, event为传递的事件指针 
返回值:若事件被处理返回true, 否则返回false。 
说明: 这个函数需要手动去释放事件的内存。

2)postEvent方法

postEvent()は、指定された受信者がイベント・キューにイベントを登録し、その後返す非同期メソッドです。次のように関数のプロトタイプは次のとおりです。

static void QCoreApplication::postEvent(QObject *receiver, QEvent *event,
				 int priority = Qt::NormalEventPriority); 
参数:receiver为接受事件的对象, event为传递的事件指针, priority为优先级 
说明:这个函数不需要手动去释放事件的内存,有Qt框架自动释放。

使用例とのSendEvent PostEventは、以下:
ヘッダ

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    virtual bool event(QEvent *event) override;
};

これは、カスタムイベントイベント()関数ハンドルは、後に使用されるウィジェットを定義します。
ソース・ファイル

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    // 创建按钮并布局
    QPushButton *button = new QPushButton("CreateEvent", this);
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(button);
    this->setGeometry(100, 100, 800, 600);

    // 建立连接, 发送信号
    QObject::connect(button, &QPushButton::clicked, [=](void)->void{
        // 使用PostEvent方式发送
        CustomerEvent *customerEvent = new CustomerEvent("PostCustomerEvent");
        QCoreApplication::postEvent(this, customerEvent);

        // 使用SendEvent方式发送
        CustomerEvent *sendCustomerEvent = new CustomerEvent("SendCustomerEvent");
        bool result = QCoreApplication::sendEvent(this, sendCustomerEvent);
        qDebug() << "The Dispose Result Is " << result;
        delete sendCustomerEvent;
    });
}

Widget::~Widget()
{

}

ここではボタンが押されたときにカスタマイズされたイベントを送信するためのボタンを作成します。

4、イベント処理

::カスタムイベントを処理するのはQObject()の方法をオーバーライドして、イベント。コードは以下の通りであります:

bool Widget::event(QEvent *event)
{
    if (event->type() == CustomerEvent::eventType())
    {
        CustomerEvent *customerEvent = dynamic_cast<CustomerEvent*>(event);
        qDebug() << customerEvent->getValueString();
        return true;
    }
    return QWidget::event(event);
}

イベントは、そうでない場合はfalse機能を処理された場合はtrueを返します。

プログラム全体の結果を操作します:

“SendCustomerEvent” 
The Dispose Result Is true 
“PostCustomerEvent” 

そのようなイベントループ電流オブジェクト分散処理後の営業時間など、のSendEvent()イベント関数を処理する機能、可視。

おすすめ

転載: blog.csdn.net/QIJINGBO123/article/details/88683703