目次
2.QLabelコントロールのマウスイベント処理機能を知る必要があります
3.QLabelコントロールのマウスイベント処理機能を記述します
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、イベントイベントフィルター
プログラムがイベントをイベントディストリビューターに配布する前に、フィルターを使用して傍受することができます