QT 事件
一. 鼠标事件
1. 鼠标移入移出事件
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QEvent>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
//重写 鼠标移入
void enterEvent(QEvent *);
//重写 鼠标移出
void leaveEvent(QEvent *);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//鼠标移入
void MainWindow::enterEvent(QEvent *)
{
qDebug()<<"鼠标移入";
}
//鼠标移出
void MainWindow::leaveEvent(QEvent *)
{
qDebug()<<"鼠标移出";
}
运行结果:
2. 鼠标单击事件
重写:
// 鼠标点击
void mousePressEvent(QMouseEvent *);
实现:
#include <QMouseEvent>
// 鼠标点击
void MainWindow::mousePressEvent(QMouseEvent * event)
{
//获取点击的下标
qDebug() << event->x() << ":" << event->y();
if(event->button() == Qt::LeftButton)
{
qDebug() << "左键点击" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右键点击" ;
}
else if(event->button() == Qt::MidButton)
{
qDebug() << "中键点击" ;
}
}
3. 鼠标按下移动事件
// 鼠标按下移动事件
void mouseMoveEvent(QMouseEvent *);
// 鼠标按下移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *)
{
qDebug()<<"鼠标按下移动";
}
4. 鼠标按下松开事件
// 鼠标按下松开
void mouseReleaseEvent(QMouseEvent *);
// 鼠标按下松开
void MainWindow::mouseReleaseEvent(QMouseEvent *)
{
qDebug() << "鼠标松开" ;
}
5. 鼠标双击事件
// 鼠标双击事件
void mouseDoubleClickEvent(QMouseEvent *);
// 鼠标双击事件
void MainWindow::mouseDoubleClickEvent(QMouseEvent *)
{
qDebug() << "双击";
}
6. 鼠标滚动事件
//鼠标滚动事件
void wheelEvent(QWheelEvent * event);
//鼠标滚动
void MainWindow::wheelEvent(QWheelEvent * event)
{
if(event->delta() > 0)
{
qDebug() << "上滚";
}
else
{
qDebug() << "下滚";
}
}
二. 键盘事件
1. 单按键事件
// 键盘事件
void keyPressEvent(QKeyEvent *);
//键盘事件
void MainWindow::keyPressEvent(QKeyEvent * event)
{
switch (event->key())
{
//ESC键
case Qt::Key_Escape:
qDebug() <<"ESC";
break;
//回车键
case Qt::Key_Return:
qDebug() <<"Enter";
break;
//退格键
case Qt::Key_Backspace:
qDebug() <<"Back";
break;
//空格键
case Qt::Key_Space:
qDebug() <<"Space";
break;
//F1键
case Qt::Key_F1:
qDebug() <<"F1";
break;
}
}
2. 组合键事件
//键盘事件
void MainWindow::keyPressEvent(QKeyEvent * event)
{
//先检测Ctrl键是否按下
if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_A)
{
qDebug() << "ctrl + a";
}
if(event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_M)
{
qDebug() << "ctrl + m";
}
}
3. 键盘+鼠标 事件
ctrl + 左键 事件需要在鼠标单击事件中实现
// 鼠标点击
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (QApplication::keyboardModifiers() == Qt::ControlModifier && event->button() == Qt::LeftButton)
{
qDebug() << "ctrl + 左键";
}
}
a+ 左键 事件则需要在鼠标单击事件中实现
// 键盘事件
void MainWindow::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_A && QApplication::mouseButtons() == Qt::LeftButton)
{
qDebug() << "a + 左键";
}
}
三. 定时器
点击发送验证码功能,倒计时 60秒
1. QTimer 实现
QPushButton * button = new QPushButton(this);
button->setText("发送验证码");
QTimer * timer = new QTimer(this); // 定时任务对象
static int num = 5;
connect(button,&QPushButton::clicked,[=](){
// 点击按钮启动定时器
//如果定时器没有激活,才启动,防止多次点击start按钮出现错误
if (timer->isActive() == false)
{
timer->start(1000); // 隔 1000 毫秒触发
num = 5;
}
connect(timer,&QTimer::timeout,[=](){
if (num > 0){
button->setText(QString::number(num));
num--;
} else
{
timer->stop();
button->setText("发送验证码");
}
});
});
2. 重写父类的 timerEvent
// 定时器事件
void timerEvent(QTimerEvent *);
void MainWindow::timerEvent(QTimerEvent * event)
{
qDebug()<< "定时器执行了";
}
启动方法:
startTimer(1000); // 隔 1000 毫秒触发