QT5事件处理

简介: 鼠标事件包括鼠标的移动,鼠标键按下、松开、单击、双击等。本例将介绍如 何获得和处理鼠标事件。

QT5事件处理


鼠标事件及实例

鼠标事件包括鼠标的移动,鼠标键按下、松开、单击、双击等。本例将介绍如 何获得和处理鼠标事件。


示例代码:

mouseevent.h

#ifndef TEST_MOUSEEVENT_H
#define TEST_MOUSEEVENT_H
#include <QMainWindow>
#include <QLabel>
class MouseEvent : public QMainWindow
{
    Q_OBJECT
public:
    MouseEvent(QWidget *parent = 0);
    ~MouseEvent() override = default;
protected:
    void mousePressEvent(QMouseEvent *e) override;
    void mouseMoveEvent(QMouseEvent *e) override;
    void mouseReleaseEvent(QMouseEvent *e) override;
    void mouseDoubleClickEvent(QMouseEvent *e) override;
private:
    QLabel *statusLabel;
    QLabel *MousePosLabel;
};
#endif //TEST_MOUSEEVENT_H


mouseevent.cpp

#include "mouseevent.h"
#include <QStatusBar>
#include <QMouseEvent>
MouseEvent::MouseEvent(QWidget *parent)
        :QMainWindow(parent)
{
    setWindowTitle(tr("鼠标事件"));
    statusLabel = new QLabel;
    statusLabel->setText (tr ("当前位置:"));
    statusLabel->setFixedWidth(100);
    MousePosLabel = new QLabel;
    MousePosLabel->setText (tr (""));
    MousePosLabel->setFixedWidth(100);
    statusBar()->addPermanentWidget(statusLabel);
    statusBar()->addPermanentWidget(MousePosLabel);
    this->setMouseTracking(true);
    resize(400,200);
}
void MouseEvent::mousePressEvent(QMouseEvent *e)
{
    QString str="("+QString::number(e->x())+","+QString::number(e->y()) + ")";
    if(e->button()==Qt::LeftButton)
        statusBar()->showMessage(tr("左键:")+str);
    else if (e->button () ==Qt::RightButton)
        statusBar()->showMessage(tr("右键:")+str);
    else if(e->button()==Qt::MidButton)
        statusBar()->showMessage(tr("中键:")+str);
}
void MouseEvent::mouseMoveEvent(QMouseEvent *e)
{
    MousePosLabel->setText("("+QString::number(e->x())+", "+QString::number(e->y())+")");
}
void MouseEvent::mouseReleaseEvent(QMouseEvent *e)
{
    QString str="("+QString::number(e->x())+","+QString::number(e->y()) +")";
    statusBar()->showMessage (tr ("释放在:") +str, 3000);
}
void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e)
{
    QWidget::mouseDoubleClickEvent(e);
}


main.cpp

#include <QApplication>
#include "mouseevent.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MouseEvent ee;
    ee.show();
    return a.exec ();
}


示例图片:

bdd06272ed104bbdaafdcf9f0b0ebfb2.png


键盘事件及实例

图像处理和游戏应用程序中有时需要通过键盘控制某个对象的移动,此功能 可以通过对键盘事件的处理来实现。键盘事件的获取是通过重定义QWidget类的 keyPressEvent()和 keyReleaseEvent()来实现的。


示例代码:

keyevent.h

#ifndef TEST_KEYEVENT_H
#define TEST_KEYEVENT_H
#include <QMainWindow>
#include <QKeyEvent>
#include <QLabel>
class KeyEvent : public QMainWindow
{
    Q_OBJECT
public:
    KeyEvent(QWidget *parent = 0);
    ~KeyEvent() override = default;
protected:
    void keyPressEvent(QKeyEvent *e) override;
    void keyReleaseEvent(QKeyEvent *e) override;
private:
    QLabel *statusLabel;
    QLabel *MousePosLabel;
};
#endif //TEST_KEYEVENT_H


keyevent.cpp

#include "keyevent.h"
#include <QStatusBar>
KeyEvent::KeyEvent(QWidget *parent)
        :QMainWindow(parent)
{
    setWindowTitle(tr("键盘事件"));
    statusLabel = new QLabel;
    statusLabel->setText (tr ("当前位置:"));
    statusLabel->setFixedWidth(100);
    MousePosLabel = new QLabel;
    MousePosLabel->setText (tr (""));
    MousePosLabel->setFixedWidth(100);
    statusBar()->addPermanentWidget(statusLabel);
    statusBar()->addPermanentWidget(MousePosLabel);
    this->setMouseTracking(true);
    resize(400,200);
}
void KeyEvent::keyPressEvent(QKeyEvent *e)
{
    statusBar()->showMessage(tr("按下:")+ toupper(e->key()));
}
void KeyEvent::keyReleaseEvent(QKeyEvent *e)
{
    statusBar()->showMessage (tr ("释放:") + toupper(e->key()), 3000);
}


main.cpp

#include <QApplication>
#include "keyevent.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    KeyEvent ee;
    ee.show();
    return a.exec ();
}


示例图片:

9c164c1217bf4a1886db0ce3d5b3da19.png


事件过滤及实例

Qt的事件模型中提供的事件过滤器功能使得一个QObject对象可以监视另一 个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器,可以在事 件到达该对象前捕获事件,从而起到监视该对象事件的效果。


如,Qt已经提供了 QPushButton用于表示一个普通的按钮类,如果需要实现 一个动态的按钮,即当鼠标按下时按钮文字发生变化,则需要同时响应鼠标的按下等事件。


示例代码:

eventfilter.h

#ifndef TEST_EVENTFILTER_H
#define TEST_EVENTFILTER_H
#include <QMainWindow>
#include <QEvent>
#include <QLabel>
class EventFilter : public QMainWindow
{
public:
    explicit EventFilter(QWidget * widget = 0);
    ~EventFilter() override = default;
protected:
    bool eventFilter(QObject *o,QEvent *e) override;
    void mousePressEvent(QMouseEvent *e) override ;
private:
    QLabel *label_;
};
#endif //TEST_EVENTFILTER_H


eventfilter.cpp

#include "eventfilter.h"
#include <QStatusBar>
EventFilter::EventFilter(QWidget *widget)
{
    label_ = new QLabel(this);
    // setCentralWidget(button_);
    label_->installEventFilter(this);
}
bool EventFilter::eventFilter(QObject *o, QEvent *e)
{
    if(o==label_ && e->type()==QEvent::MouseButtonPress)
    {
        label_->setText("鼠标按下");
    }
    return QMainWindow::eventFilter(o,e);
}
void EventFilter::mousePressEvent(QMouseEvent *e)
{
    statusBar()->showMessage("鼠标按下");
}


main.cpp

#include <QApplication>
#include "EventFilter.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    EventFilter ee;
    ee.show();
    return a.exec ();
}


示例图片:

ceefa3256feb45d1867f3726f0a1e85c.png

目录
相关文章
|
6月前
|
存储 开发框架 开发者
QT C++焦点事件:多角度解析实用技巧与方法
QT C++焦点事件:多角度解析实用技巧与方法
1266 0
|
6月前
|
API
QT基础入门——Qt事件(五)
QT基础入门——Qt事件(五)
398 0
QT基础入门——Qt事件(五)
|
存储 Cloud Native 程序员
C++ Qt 事件(event)
C++ Qt 事件(event)
24 QT - 事件
24 QT - 事件
39 0
|
1月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
80 3
(13) Qt事件系统(two)
|
1月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
71 0
(12)Qt事件系统(one)
|
3月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
205 4
|
5月前
Qt事件分发器、事件过滤器
Qt事件分发器、事件过滤器
|
4月前
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
115 0
|
6月前
|
开发框架 算法 程序员
【Qt 元对象系统】深入探索Qt事件过滤:从基础到高级应用
【Qt 元对象系统】深入探索Qt事件过滤:从基础到高级应用
182 7
下一篇
无影云桌面