记录一个初学小白的学习过程,记录一些浅显的学习笔记
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