第十一章:鼠标和键盘事件

回顾:
第一章:Qt的概述
第二章:在Ubuntu编写第一个Qt程序
第三章:Qt的字符串和字符编码
第四章:Qt的信号和槽
第五章:Qt容器窗口(父窗口)
第六章:面向对象的Qt编程
第七章:Qt设计师使用(designer)
第八章:Qt创造器的使用(qtcreator)
第九章:资源和图像
第十章:目录与定时器

鼠标和键盘事件

一、鼠标事件

#include <QMouseEvent>
void mousePressEvent(QMouseEvent *)//按下
void mouseReleaseEvent(QMouseEvent)//抬起
void mouseMoveEvent(QMouseEvent *)//移动
void mouseDoubleClickEvent(QMouseEvent *)//双击

button()//获取引发鼠标事件的案件
pos()//获取鼠标点击的位置

案例:通过鼠标拖拽label移动

  • 工程名:Mouse
  • 类名:MouseDialog
  • 设置label的背景颜色:autoFillBackground勾选√

MouseDialog.h

#ifndef MOUSEDIALOG_H
#define MOUSEDIALOG_H

#include <QDialog>
#include <QMouseEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class MouseDialog; }
QT_END_NAMESPACE

class MouseDialog : public QDialog
{
    Q_OBJECT

public:
    MouseDialog(QWidget *parent = nullptr);
    ~MouseDialog();
private:
	//鼠标按下时被执行
	void mousePressEvent(QMouseEvent *);
	//鼠标抬起时被执行
	void mosuseReleaseEvent(QMouseEvent *);
	//鼠标移动时被执行
	void mouseMoveEvent(QMouseEvent *);
private:
    Ui::MouseDialog *ui;
    bool m_bDrag;//标记是否左键已经选中label
    QPoint m_ptPos;//记录鼠标点击和label的相对位置
};
#endif // MOUSEDIALOG_H

MuoseDialog.cpp

#include "MouseDialog.h"
#include "ui_MouseDialog.h"

MouseDialog::MouseDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::MouseDialog)
{
    ui->setupUi(this);
    m_bDrag = false;
}

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

//鼠标按下时被执行
void MouseDialog::mousePressEvent(QMouseEvent *event)
{
    //判断是否为鼠标左键
    if(event->button() == Qt::LeftButton){
        //获取label矩形区域
        QRect rcLabel = ui->label->frameRect();
        //平移让和鼠标事件使用相同的坐标
        rcLabel.translate(ui->label->pos());
        //判断鼠标点击的位置是否在rcLabel矩形范围中
        if(rcLabel.contains(event->pos())==true){
            m_bDrag = true;
            //记录鼠标和label的相对位置
            m_ptPos= ui->label->pos() - event->pos();
        }
    }
}

//鼠标抬起时被执行
void MouseDialog::mosuseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){
        m_bDrag = false;
    }
}

//鼠标移动时被执行
void MouseDialog::mouseMoveEvent(QMouseEvent *event)
{
    if(m_bDrag == true){
        //计算label移动的新位置
        QPoint newPos = event->pos() + m_ptPos;
        //设置限制
        //获取窗口大小
        QSize sz = size();
        //获取label大小
        QSize szLabel = ui->label->size();
        //x:0--(窗口-label宽)
        if(newPos.x() < 0){
            newPos.setX(0);
        }
        else if(newPos.x() > sz.width()-szLabel.width()){
            newPos.setX(sz.width()-szLabel.width());
        }
        //y:0--(窗口高-label高)
        if(newPos.y() < 0){
            newPos.setY(0);
        }
        else if(newPos.y() > sz.height()-szLabel.height()){
            newPos.setY(sz.height()-szLabel.height());
        }
        //移动label到新的位置
        ui->label->move(newPos);
    }
}

在这里插入图片描述

二、键盘事件

#include <QKeyEvent>
//按键按下
void keyPressEvent(QKeyEvent *)
//按键抬起
void keyReleaseEvent(QKeyEvent *)

int key()//获取按键代码,用于区分不同的按键
QString text()//获取按键文本

案例:按键按下给出相应的反应
KeyboardDialog.h

#define KEYBOARDDIALOG_H

#include <QDialog>
#include <QKeyEvent>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class KeyboardDialog; }
QT_END_NAMESPACE

class KeyboardDialog : public QDialog
{
    Q_OBJECT

public:
    KeyboardDialog(QWidget *parent = nullptr);
    ~KeyboardDialog();
private:
    //
    void keyPressEvent(QKeyEvent *);
    //
    void keyReleaseEvent(QKeyEvent *);

private:
    Ui::KeyboardDialog *ui;
};
#endif // KEYBOARDDIALOG_H

KeyboardDialog.cpp

#include "KeyboardDialog.h"
#include "ui_KeyboardDialog.h"

KeyboardDialog::KeyboardDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::KeyboardDialog)
{
    ui->setupUi(this);
}

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

//
void KeyboardDialog::keyPressEvent(QKeyEvent *event)
{
    qDebug("press key!");
    qDebug("key code:%d", event->key());
    qDebug() << "key text:" << event->text();
}

//
void KeyboardDialog::keyReleaseEvent(QKeyEvent *event)
{
    qDebug("release key!");
    qDebug("key code:%d", event->key());
    qDebug() << "key text:" << event->text();
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值