Qtイベントとタイマー

目次

1.マウスイベント

1.マウスイベントとは何かを知る必要があります

2.QLabelコントロールのマウスイベント処理機能を知る必要があります

3.QLabelコントロールのマウスイベント処理機能を記述します

2.タイマーの実装方法

1.タイマーイベント

2.タイマークラスQTimer

3.イベントディスパッチャ

4.イベントイベントフィルター


1.マウスイベント

例として、QLabelコントロールのマウスイベントを取り上げます。

1.マウスイベントとは何かを知る必要があります

列挙型QEvent :: Type

2.QLabelコントロールのマウスイベント処理機能を知る必要があります

3.QLabelコントロールのマウスイベント処理機能を記述します

xy座標を取得します:ev-> x()ev-> y()

フォーマット文字列:QString( "%1、%2")。arg(111).arg(222)

すべてのキーを判断します:ev-> button()、キーのキー値は次のとおりです

重要な内容:

QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
if (ev->button() == Qt::LeftButton) //左键按下判断
{
    QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
    qDebug() <<str.toUtf8().data();
}

すべてのコンテンツ:

#include <QLabel>
#include <QEvent>
#include <QMouseEvent>

class mylabel : public QLabel
{
    Q_OBJECT
public:
    explicit mylabel(QWidget *parent = 0);

    virtual void enterEvent(QEvent *event);//鼠标进入事件 虚函数重写
    virtual void leaveEvent(QEvent *event);//鼠标离开事件 虚函数重写
    virtual void mouseMoveEvent(QMouseEvent * ev);//鼠标移动事件 虚函数重写
    virtual void mousePressEvent(QMouseEvent * ev);//鼠标按下事件 虚函数重写
    virtual void mouseReleaseEvent(QMouseEvent * ev);//鼠标释放事件 虚函数重写

signals:

public slots:
};
#include "mylabel.h"
#include "QDebug"
#include "QString"

mylabel::mylabel(QWidget *parent) : QLabel(parent)
{}
//鼠标进入事件
void mylabel::enterEvent(QEvent *event)
{qDebug() <<"鼠标进入";}

//鼠标离开事件
void mylabel::leaveEvent(QEvent *event)
{ qDebug() <<"鼠标离开";}

//鼠标移动事件 虚函数重写
void mylabel::mouseMoveEvent(QMouseEvent * ev)
{qDebug() <<"鼠标移动";}

//鼠标按下事件 虚函数重写
void mylabel::mousePressEvent(QMouseEvent * ev)
{
    if (ev->button() == Qt::LeftButton) {//左键按下判断
        //格式化字符串
        QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
        qDebug() <<str.toUtf8().data();}
}
//鼠标释放事件 虚函数重写
void mylabel::mouseReleaseEvent(QMouseEvent * ev)
{qDebug() <<"鼠标释放";}

第二に、タイマーの実装方法

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{
    ui->setupUi(this);
    //定时器的第一种方法:通过定时器事件和重写定时器处理函数
    //启动定时器,周期单位ms
    //timer1_id = startTimer(1000);
    //timer2_id = startTimer(10000);

    //定时器的第二种方法:通过定时器类
    QTimer *timer = new QTimer(this);
    timer->start(500);
    connect(timer, &QTimer::timeout, [=](){
        static int num = 1;
        ui->label->setNum(num++);
    });
    //通过点击按钮停止定时器
    connect(ui->btn_stop, &QPushButton::clicked, [=](){
        if (timer->isActive())
            timer->stop();
        else
            timer->start(500);
    });
}

Widget::~Widget()
{
    delete ui;
}

//定时器的第一种方法:重写定时器事件处理函数
void Widget::timerEvent(QTimerEvent *ev)
{
    static int num = 1;

    if (ev->timerId() == timer1_id){
        ui->label->setNum(num++);
    } else if (ev->timerId() == timer2_id){
        num = 1;
    }
}

1.タイマーイベント

1. QEvent :: Timerイベント

2. QEvent :: Timerイベントの処理関数はvoidtimerEvent(QTimerEvent * ev)です。

3.タイマーstartTimer(1000)ミリ秒を開始し、タイマーの一意のIDを返します

4.複数のタイマーがある場合、startTimer()によって返されるタイマーIDを、QTimerEvent-> timerid()によって取得されるQTimerEventイベントのタイマーIDと比較できます。このIDは、startTimer()によって返されるタイマーIDです。

2.タイマークラスQTimer

1.タイマーを作成しますQTimer * timer = new QTimer(this);

2.タイマーを開始しますtimer-> start(500);

3.タイムアウト信号を介して信号とスロットをバインドします

3、イベントイベントディスパッチャ

bool QObject :: event(QEvent * e)イベントディスパッチャを使用すると、QObject派生クラスの仮想関数をオーバーライドして、イベントの分散をカスタマイズできます。これは、実際の開発では推奨されません。https://www.cnblogs.com/zhaobinyouth/p/7688954.html

 //重写event事件分发器,拦截鼠标按下事件,实际工程并不会拦截!!!!!
 bool mylabel::event(QEvent *e)
 {
    //自己处理按钮 按下事件
    if (e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *ev = dynamic_cast<QMouseEvent *>(e);//类型转换,将父类对象转为子类对象
        QString str = QString("Event函数中,鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
        qDebug() <<str.toUtf8().data();

        return true;//表示该事件已经被处理了,true代表用户自己处理这个事件 不向下分发
    }

    //其他事件交给父类处理,默认处理
    return QLabel::event(e);
 }

4、イベントイベントフィルター

プログラムがイベントをイベントディストリビューターに配布する前に、フィルターを使用して傍受することができます

 

おすすめ

転載: blog.csdn.net/m0_37845735/article/details/108439133