事件

鼠标事件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QMouseEvent>
#include <QEvent>
#include <QMenu>
#include <QLabel>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

protected:
    //鼠标按下处理函数重写
    void mousePressEvent(QMouseEvent *event);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event);
    //鼠标松开事件
    void mouseReleaseEvent(QMouseEvent *event);
    //鼠标双击事件
    void mouseDoubleClickEvent(QMouseEvent *event);

private:
    Ui::MainWindow *ui;
    QLabel *statusLabel;
    QLabel *MousePosLabel;
};
#endif // MAINWINDOW_H

 

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //设置主窗体的标题
    setWindowTitle(tr("鼠标事件"));

    //创建控件statusLabel
    statusLabel = new QLabel;
    statusLabel->setText(tr("当前位置:"));
    statusLabel->setFixedWidth(100);

    //创建控件MousePosLabel
    MousePosLabel = new QLabel;
    MousePosLabel->setText(tr(""));
    MousePosLabel->setFixedWidth(100);

    //在mainwindow状态栏中增加控件
    statusBar()->addPermanentWidget(statusLabel);
    statusBar()->addPermanentWidget(MousePosLabel);

    //设置窗体是否追踪鼠标,默认false
    this->setMouseTracking(true);
    resize(400,200);

}

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

void MainWindow::mousePressEvent(QMouseEvent *event)
{

    QString str = "("+QString::number(event->x())+","+QString::number(event->y())+")";
    if(event->button() == Qt::LeftButton)
    {
        statusBar()->showMessage(tr("左键:")+str);
    }
    else if(event->button() == Qt::RightButton)
    {
        statusBar()->showMessage(tr("右键:")+str);
    }
    else if(event->button() == Qt::MidButton)
    {
        statusBar()->showMessage(tr("中键:")+str);
    }}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    MousePosLabel->setText("("+QString::number(event->x())+","+QString::number(event->y())+")");
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    QString str = "(" + QString::number(event->x()) + "," + QString::number(event->y()) + ")";
    statusBar()->showMessage(tr("释放在:") + str,3000);
}

void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
    qDebug()<<"双击";
}

 

 

按键事件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QKeyEvent>
#include <QPaintEvent>
#include <QPainter>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void drawPix();
    //重写按键事件
    void keyPressEvent(QKeyEvent *event);
    //重写画图事件
    void paintEvent(QPaintEvent *event);

private:
    QPixmap *pix;   //绘制图形
    QImage image;   //界面里的那个小图标
    int startX;     //图标的位置X
    int startY;     //图标的位置Y(左上角的位置)
    int width;      //界面的宽度
    int height;     //界面高度
    int step;       //网格大小(移动的步进)


private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

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

    setWindowTitle(tr("键盘事件"));

    setAutoFillBackground(true);

    QPalette palette = this->palette();
    palette.setColor(QPalette::Window,Qt::white);
    setPalette(palette);

    setMinimumSize(512,256);
    setMaximumSize(512,256);

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

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

    image.load("C:/Users/Administrator/Desktop/123.png");

    startX = 100;
    startY = 100;

    step = 20;

    drawPix();

    resize(512,256);
}

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

void Widget::drawPix()
{
    //背景色底色填充为白色
    pix->fill(Qt::white);
    QPainter *painter = new QPainter;
    //创建QPen对象,使用画笔 DotLine ,绘制网格
    QPen pen(Qt::DotLine);

    //循环画出横线竖线
    for(int i = step; i<width ;i = i +step)
    {
        painter->begin(pix);
        painter->setPen(pen);
        painter->drawLine(QPoint(i,0),QPoint(i,height));
        painter->end();
    }
    for(int i = step; i<height ;i = 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::keyPressEvent(QKeyEvent *event)
{
    //判断ctrl是否按下 当ctrl按下同时按上下左右为微调
    if(event->modifiers() == Qt::ControlModifier)
    {
        if(event->key() == Qt::Key_Left)
        {
            startX = (startX - 1 < 0)?startX:startX-1;
        }
        if(event->key() == Qt::Key_Right)
        {
            startX = (startX +1+image.width()>width)?startX:startX+1;
        }
        if(event->key() == Qt::Key_Up)
        {
            startY = (startY-1<0)?startY:startY-1;
        }
        if(event->key() == Qt::Key_Down)
        {
            startY = (startY+1+image.height()>height)?startY:startY+1;
        }
    }
    else    //没有ctrl按下时上下左右为正常移动
    {
        startX = startX - startX%step;
        startY = startY - startY%step;

        if(event->key() == Qt::Key_Left)
        {
            startX = (startX-step<0)?startX:startX-step;
        }
        if(event->key() == Qt::Key_Right)
        {
            startX = (startX + step + image.width()>width)?startX:startX+step;
        }
        if(event->key() == Qt::Key_Up)
        {
            startY = (startY-step<0)?startY:startY-step;
        }
        if(event->key() == Qt::Key_Down)
        {
            startY = (startY + step + image.height()>height)?startY:startY+step;
        }
        //home键复位 置为左上
        if(event->key() == Qt::Key_Home)
        {
            startX = 0;
            startY = 0;
        }
        //end键结束 置为右下
        if(event->key() == Qt::Key_End)
        {
            startX = width-image.width();
            startY = height-image.height();
        }
        //调整位置后 重新绘制小图标
        drawPix();
        update();
    }
}

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

 

posted @ 2020-05-17 16:00  祁峰_1024  阅读(139)  评论(0编辑  收藏  举报