QT 鼠标、键盘事件

记录一个初学小白的学习过程,记录一些浅显的学习笔记


QMouseEvent 鼠标事件

目标:实现一个对话框,鼠标在对话框内移动时,显示鼠标当前的坐标以及鼠标点击时显示具体按键以及位置,在底部状态栏显示

基类:QMainWindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QLabel>
#include <QMouseEvent> //鼠标事件
#include <QStatusBar>  //窗口状态栏实现

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void mouseMoveEvent(QMouseEvent *e);  //鼠标移动事件
    void mousePressEvent(QMouseEvent *e);  //鼠标按压事件
    void mouseReleaseEvent(QMouseEvent *e);  //鼠标按键释放事件

private:
    QLabel *statuslabel;
    QLabel *mouselabelpos;

};
#endif // MAINWINDOW_H
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("测试鼠标事件程序");
    statuslabel=new QLabel;
    statuslabel->setText("鼠标在当前窗口的坐标:");
    statuslabel->setFixedWidth(200);

    mouselabelpos=new QLabel;
    mouselabelpos->setText("");
    mouselabelpos->setFixedWidth(200);

    //在状态栏当中添加窗口小控件对象
    statusBar()->addPermanentWidget(statuslabel);
    statusBar()->addPermanentWidget(mouselabelpos);

    this->setMouseTracking(true); //设置鼠标追踪,否则只有在点击状态下才能改变坐标

    resize(800,600);
}

MainWindow::~MainWindow()
{
}

void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    mouselabelpos->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){
        ()->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,1000); //后面的数字参数是停留时间,然后消失
}

QKeyEvent 键盘事件

目标:实现一个图片在网格图内移动,每次移动一个网格的距离,不能超出窗口区域

以左上角为原点,向右为x轴,向下为y轴

基类:QWidget

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QKeyEvent> //键盘事件
#include <QPaintEvent>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void drawpixfunc();
    void paintEvent(QPaintEvent *);

    void keyPressEvent(QKeyEvent *); //键盘按钮控制老虎动向

private:
    QPixmap *pix;
    QImage image;
    int startx;
    int starty;
    int width;
    int height;
    int step; //步长
};
#endif // WIDGET_H
#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("老虎移动测试");

    setAutoFillBackground(true);

    //QPalete是Qt中调度板类
    QPalette plet=this->palette();
    plet.setColor(QPalette::Window,Qt::white);
    setPalette(plet);

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

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

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

    image.load("E:/test.jpg");

    startx=60;  //起始x坐标
    starty=60;  //起始y坐标
    step=30;    //每一步走多远,这里是一个方格的距离

    drawpixfunc(); //调用函数绘制操作
    resize(800,600);
}

Widget::~Widget()
{
}

void Widget::drawpixfunc()   //绘制网格图函数
{
    pix->fill(Qt::green);  //填充背景为绿色

    QPainter *painter=new QPainter;
    QPen pen(Qt::DashDotLine); //点划线

    for(int i=step;i<width;i+=step){  //竖线
        painter->begin(pix);
        painter->setPen(pen);
        //窗口的左上角是原点,从左向右是x轴,从上到下是y轴
        painter->drawLine(QPoint(i,0),QPoint(i,height));
        painter->end();
    }

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

    painter->begin(pix);
    painter->drawImage(QPoint(startx,starty),image);
    painter->end();

}
void Widget::paintEvent(QPaintEvent *)
{
    QPainter pt;
    pt.begin(this);
    pt.drawPixmap(QPoint(0,0),*pix);
    pt.end();
}

void Widget::keyPressEvent(QKeyEvent *evt) //键盘按钮控制老虎动向
{
    startx=startx-startx%step;
    starty=starty-starty%step;

    if(evt->key()==Qt::Key_Left)  //检测到左按键
    {
        startx=(startx-step<0)?startx:startx-step;
    }
    if(evt->key()==Qt::Key_Right)
    {
        startx=(startx+step+image.width()>width)?startx:startx+step;
    }
    if(evt->key()==Qt::Key_Up)
    {
        starty=(starty-step<0)?starty:starty-step;
    }
    if(evt->key()==Qt::Key_Down)
    {
        starty=(starty+step+image.height()>height)?starty:starty+step;
    }

    //调用重绘
    drawpixfunc();
    update();
}

gg,推荐课程:https://xxetb.xetslk.com/s/kNPSd

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值