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

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

前置环境

运行环境:qt creator 4.12

学习内容和效果演示:

1.鼠标事件

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

2.键盘事件

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

详细主要代码

1.鼠标事件

#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 负责将画板呈现。

#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)

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值