【QT】鼠标事件<QMouseEvent>

事件(鼠标事件)

功能单一的事件,鼠标进来是一个事件,鼠标出去是另外一个事件。

QT提供了很多的事件函数,我们通过重写这些事件函数就可以实现我们想要的效果。

  • 事件函数都是虚函数

写一个子类,继承QLabel,那我们就可以重写事件。

在这里插入图片描述

使用label标签,使得label继承mylabel

QLabel

在这里插入图片描述


//发生改变
virtual void 
changeEvent(QEvent *ev) override
//上下文菜单:在计算机图形用户界面中,通过鼠标右键点击或其他特定操作触发的一个弹出式菜单,其中包含了针对当前选定对象或区域的相关操作选项
virtual void 
contextMenuEvent(QContextMenuEvent *ev) override
//事件
virtual bool 
event(QEvent *e) override
//焦点进去
virtual void 
focusInEvent(QFocusEvent *ev) override
virtual bool 
focusNextPrevChild(bool next) override
//焦点移出
virtual void 
focusOutEvent(QFocusEvent *ev) override

//键盘按键按下事件
virtual void 
keyPressEvent(QKeyEvent *ev) override
//鼠标移动事件
virtual void 
mouseMoveEvent(QMouseEvent *ev) override
virtual void 
mousePressEvent(QMouseEvent *ev) override
virtual void 
mouseReleaseEvent(QMouseEvent *ev) override
//刷新窗口的事件
virtual void 
paintEvent(QPaintEvent *) override

由于QLabel继承自QWidget。所以QWidget中还有更多。


//鼠标移入
virtual void enterEvent(QEvent *event)
//鼠标移出
virtual void leaveEvent(QEvent *event)
//鼠标点两下
virtual void mouseDoubleClickEvent(QMouseEvent *event)
    //定时器
virtual  void timerEvent(QTimerEvent *);

上面的函数都是回调函数,因此只需要对他们函数的功能进行重写就好了,在触发条件时,它们会自动执行。

在这里插入图片描述

鼠标移到白云会变为猪头

protected:
    //鼠标进入
    void enterEvent(QEvent *);  //都是回调函数
    //鼠标离开
    void leaveEvent(QEvent *);

//鼠标进入 (进入边界的一瞬间触发)
void mylabel:: enterEvent(QEvent *) //都是回调函数
{
    setText("猪头");
}
//鼠标离开  (离开边界的一瞬间触发)
void mylabel:: leaveEvent(QEvent *)
{
    setText("白云");
}

QString(帮助手册)多看看

字符串可以做是否相等的判断,拼接,等等


bool operator!=(const QString &s1, const QString &s2)
bool operator!=(const char *s1, const QString &s2)
const QString operator+(const QString &s1, const QString &s2)
const QString operator+(const QString &s1, const char *s2)
.....
.....

整数转化为QString字符串类型


QString 
number(long n, int base = 10)
QString 
number(uint n, int base = 10)
QString 
number(int n, int base = 10)
QString 
number(ulong n, int base = 10)
QString 
number(qlonglong n, int base = 10)
QString 
number(qulonglong n, int base = 10)
QString 
number(double n, char format = 'g', int precision = 6)

字符串拼接

字符串拼接
// 1. str.sprintf("%d,%s",123,"aaa");
// 2.   QString str = QString("%1 %2 %3").arg("This").arg("a").arg("love");
   setText(str);             //占位符

鼠标事件

#include <QMouseEvent>

获取坐标

 QString str = QString("Presscoord:(%1,%2),%3").arg(ev->x()).arg(ev->y()));
   setText(str);
protect:   
//鼠标按下
    void mousePressEvent(QMouseEvent *ev);
    //鼠标释放
    void mouseReleaseEvent(QMouseEvent *ev);
    //鼠标移动
    void mouseMoveEvent(QMouseEvent *ev);
  • 某一个瞬间的状态用button判断
#include <QMouseEvent>

//鼠标按下
void mylabel::mousePressEvent(QMouseEvent *ev)
{
    QString btn;
    if(ev->button() == Qt::LeftButton)
    {
        btn = "leftbutton";
    }
    else if(ev->button() == Qt::RightButton)
    {
     btn = "rightbutton";
    }
    else  if(ev->button() == Qt::MidButton)
    {
        btn = "midButton";
    }

   QString str = QString("Presscoord:(%1,%2),%3").arg(ev->x()).arg(ev->y()).arg(btn);
   setText(str);
}
//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent *ev)
{
    QString btn;
    if(ev->button() == Qt::LeftButton)
    {
        btn = "leftbutton";
    }
    else if(ev->button() == Qt::RightButton)
    {
     btn = "rightbutton";
    }
    else  if(ev->button() == Qt::MidButton)
    {
        btn = "midButton";
    }

   QString str = QString("Releasecoord:(%1,%2),%3").arg(ev->x()).arg(ev->y()).arg(btn);
   setText(str);
}

鼠标移动:必须使用buttons才能判断鼠标的左右中键

  • 一个持续的状态用buttons

结合&操作符号

Qt::MouseButtons QMouseEvent::buttons(

返回事件生成时的按钮状态。按钮状态是使用OR(或)操作符的Qt::LeftButton, Qt::RightButton, Qt::MidButton的组合。

  • 对于鼠标移动事件,这是所有按下的按钮。
  • 对于鼠标按下和双击事件,这包括引起该事件的按钮。
  • 对于鼠标释放事件,这将排除引起该事件的按钮。
//鼠标移动(按住)
void mylabel:: mouseMoveEvent(QMouseEvent *ev)
{
    QString btn;
    if(ev->buttons() == Qt::LeftButton)
    {
        btn = "leftbutton";
    }
    else if(ev->buttons() == Qt::RightButton)
    {
     btn = "rightbutton";
    }
    else  if(ev->buttons() == Qt::MidButton)
    {
        btn = "midButton";
    }

   QString str = QString("MOVEcoord:(%1,%2),%3").arg(ev->x()).arg(ev->y()).arg(btn);
   setText(str);
}

QWidget 默认不追踪鼠标事件

想让它追踪需要设置窗口追踪鼠标键

this->setMouseTracking(true);

判断鼠标同时按下

if(ev->buttons() &(Qt::LeftButton|Qt::RightButton)
{                              01 |  02
                                03 -->03
}
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的例子,演示如何在Qt中使用QVector<QPointF>记录路径节点,连接图元,鼠标移动线段,线段随着变动。 MainWindow.h文件: ```c++ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPainter> #include <QMouseEvent> #include <QGraphicsScene> #include <QGraphicsView> #include <QGraphicsLineItem> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); protected: void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); private: Ui::MainWindow *ui; QVector<QPointF> m_points; bool m_isDrawing; QGraphicsScene* m_scene; QGraphicsView* m_view; QGraphicsLineItem* m_line; }; #endif // MAINWINDOW_H ``` MainWindow.cpp文件: ```c++ #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 创建场景和视图 m_scene = new QGraphicsScene(this); m_view = new QGraphicsView(m_scene, this); m_view->setGeometry(10, 50, 780, 500); m_view->setRenderHint(QPainter::Antialiasing); // 初始化 m_isDrawing = false; m_line = nullptr; } MainWindow::~MainWindow() { delete ui; } void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(QPen(Qt::red, 2)); // 绘制路径节点 for (int i = 0; i < m_points.size(); ++i) { painter.drawEllipse(m_points[i], 3, 3); } // 绘制线段 for (int i = 0; i < m_points.size() - 1; ++i) { painter.drawLine(m_points[i], m_points[i + 1]); } } void MainWindow::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // 添加节点 m_points.append(event->pos()); m_isDrawing = true; // 创建线段item m_line = new QGraphicsLineItem(QLineF(event->pos(), event->pos())); m_line->setPen(QPen(Qt::red, 2)); m_scene->addItem(m_line); } } void MainWindow::mouseMoveEvent(QMouseEvent *event) { if (m_isDrawing) { // 更新节点 m_points.last() = event->pos(); // 更新线段item m_line->setLine(QLineF(m_points[m_points.size() - 2], event->pos())); // 刷新窗口 update(); } } void MainWindow::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // 添加节点 m_points.last() = event->pos(); m_isDrawing = false; // 更新线段item m_line->setLine(QLineF(m_points[m_points.size() - 2], event->pos())); // 刷新窗口 update(); } } ``` 在这个例子中,我们使用QPainter在窗口中绘制路径节点和线段,并使用QGraphicsView和QGraphicsScene来实现鼠标移动线段和线段随着变动的效果。 希望这个例子能够帮助您理解如何在Qt中使用QVector<QPointF>记录路径节点,连接图元,鼠标移动线段,线段随着变动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值