Qt 基础组件速学 鼠标和键盘事件

学习目标: 鼠标事件和键盘事件应用

前置环境

运行环境:qt creator 4.12

学习内容和效果演示:

1.鼠标事件

根据鼠标的坐标位置,做出对应的事件。

2.键盘事件

根据键盘的输入做出对应操作

详细主要代码

1.鼠标事件

cpp 复制代码
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    status = new QLabel("鼠标在当前窗口坐标为:");
    status->setFixedWidth(200);

    mouser = new QLabel("");
    mouser->setFixedWidth(200);


    statusBar()->addPermanentWidget(status);
    statusBar()->addPermanentWidget(mouser);

    this->setMouseTracking(true);
    resize(800,600);

    QImage *image=new QImage();
    if(!image->load("C:/Users/jbj/Pictures/test/IMG_5037.JPG")){
        QMessageBox::information(this,"失败","加载图片失败,请重新检查?");
        delete  image;
        return;
    }
    QLabel* imglabe = new QLabel(this);
    imglabe->setFixedSize(200,300);
    imglabe->setPixmap(QPixmap::fromImage(*image));
}

MainWindow::~MainWindow()
{
}

//鼠标移动时被调用
void MainWindow::mouseMoveEvent(QMouseEvent *e){
    mouser->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");
}
//鼠标按下时被调用
void MainWindow::mousePressEvent(QMouseEvent *e){
    QString qstr="("+QString::number(e->x())+","+QString::number(e->y())+")";
    if(e->button()==Qt::LeftButton)
    {
        statusBar()->showMessage("用户已按下鼠标[左键]坐标"+qstr);
    }
    else if(e->button()==Qt::RightButton)
    {
        statusBar()->showMessage("用户已按下鼠标[右键]坐标"+qstr);
    }
    else if(e->button()==Qt::MidButton)
    {
        statusBar()->showMessage("用户已按下鼠标[中键]坐标"+qstr);
    }
}
//鼠标释放时被调用
void MainWindow::mouseReleaseEvent(QMouseEvent *e){
    QString qstr="("+QString::number(e->x())+","+QString::number(e->y())+")";
    statusBar()->showMessage("用户已释放鼠标坐标"+qstr,20);
}

2.键盘事件

这里用到了绘画的知识点

画板 Qpalette 画家 Qpainter 钢笔QPen

理解:画师在画板上做画,会用到钢笔,当要展现时,QPainter 负责将画板呈现。

cpp 复制代码
#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("键盘测试");
    setAutoFillBackground(true);
    //调色板
    QPalette pale =this->palette();
    pale.setColor(QPalette::Window,Qt::white);
    setPalette(pale);

    setMinimumSize(800,600);
    setMaximumSize(800,600);

    width=size().width();
    height=size().height();

    pix=new QPixmap(width,height);//画板
    pix->fill(Qt::white);

    //实际物体
    main=new QPixmap(28,28);
    main->fill(Qt::red);



    sx=30;
    sy=30;
    step=30;

    Drawpinit();



    resize(800,600);
}
void Widget::Drawpinit(){
    pix->fill(Qt::white); // 清空

    QPainter* painter =new QPainter;//画家
    QPen pen(Qt::DashDotLine);

    for (int i=step; i<width;i+=step) { //竖线
        painter->begin(pix); //选择画板
        painter->setPen(pen);
        painter->drawLine(QPoint(i,0),QPoint(i,height));
        painter->end();
    }
    for(int j=step;j<height;j=j+step) // 横线
    {
        painter->begin(pix);     //选择画板
        painter->setPen(pen);
        painter->drawLine(QPoint(0,j),QPoint(width,j));
        painter->end();
    }

    painter->begin(pix);
    painter->drawPixmap(QPoint(sx,sy),*main);
    painter->end();
}


void Widget::paintEvent(QPaintEvent *){
    QPainter painter;
    painter.begin(this);
    //将之前在 Drawpinit() 函数中绘制的 QPixmap 对象绘制到 Widget 的左上角(坐标 (0, 0))。
    painter.drawPixmap(QPoint(0,0),*pix);
    painter.end();

}
void Widget::keyPressEvent(QKeyEvent *evt){
    sx=sx-sx%step;
    sy=sy-sy%step;


    //左右移动
    if(evt->key()==Qt::Key_Left)
    {
        sx=(sx-step<0)?sx:sx-step;
    }
    if(evt->key()==Qt::Key_Right)
    {
        sx=(sx+step+main->width() > width)?sx:sx+step;
    }
    if(evt->key()==Qt::Key_Up)
    {
        sy=(sy-step<0)?sy:sy-step;
    }
    if(evt->key()==Qt::Key_Down)
    {
        sy=(sy+step+main->height() >height)?sy:sy+step;
    }
    Drawpinit(); //重新设置参数
    update();   //触发绘画
}
Widget::~Widget()
{

}

总结:

键盘事件:

void keyPressEvent(QKeyEvent *evt) //按下时被调用

鼠标事件:

//鼠标移动时被调用

void mouseMoveEvent(QMouseEvent *e);

//鼠标按下时被调用

void mousePressEvent(QMouseEvent *e);

//鼠标释放时被调用

void mouseReleaseEvent(QMouseEvent *e);

详细开发则需查阅官方开发文档。

最后附上源代码链接

对您有帮助的话,帮忙点个star

26-mouserEvent · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

27-QkeyEvent · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

相关推荐
tan77º28 分钟前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
GiraKoo1 小时前
【GiraKoo】C++14的新特性
c++
悠悠小茉莉1 小时前
Win11 安装 Visual Studio(保姆教程 - 更新至2025.07)
c++·ide·vscode·python·visualstudio·visual studio
坏柠1 小时前
C++ Qt 基础教程:信号与槽机制详解及 QPushButton 实战
c++·qt
泽02022 小时前
C++之红黑树认识与实现
java·c++·rpc
雨落倾城夏未凉2 小时前
4.信号与槽
后端·qt
岁忧3 小时前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
whoarethenext3 小时前
使用 C++ 实现 MFCC 特征提取与说话人识别系统
开发语言·c++·语音识别·mfcc
R-G-B3 小时前
【MFC】Combobox下拉框中4个选项,运行后点击下拉框选项不能全部展示出来,只能显示2个选项,需要垂直滚动条滚动显示其余选项
c++·mfc
视觉人机器视觉5 小时前
Visual Studio2022和C++opencv的配置保姆级教程
c++·opencv·visual studio