栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Qt事件处理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Qt事件处理

Qt事件处理
  • 鼠标事件
  • 键盘事件
  • 事件过滤
  • 鼠标悬停事件
  • 右键菜单事件
  • 拖曳事件

鼠标事件

MouseEvent.pro

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = MouseEvent
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp 
        mouseevent.cpp

HEADERS  += mouseevent.h

main.cpp

#include "mouseevent.h"
#include 

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    MouseEvent w;
    w.show();

    return a.exec();
}

mouseevent.h

#ifndef MOUSEEVENT_H
#define MOUSEEVENT_H

#include 
#include 
#include 
#include 

class MouseEvent : public QMainWindow {
    Q_OBJECT
public:
    explicit MouseEvent(QWidget *parent = 0);
protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
    void mouseDoubleClickEvent(QMouseEvent *e);
    void wheelEvent(QWheelEvent *e);
private:
    QLabel *statusLabel;
    QLabel *MousePosLabel;
};

#endif // MOUSEEVENT_H

mouseevent.cpp

#include "mouseevent.h"

MouseEvent::MouseEvent(QWidget *parent) : QMainWindow(parent) {
    statusLabel = new QLabel(tr("当前位置:"));
    statusLabel->setFixedWidth(100);
    MousePosLabel = new QLabel;
    MousePosLabel->setFixedWidth(100);
    statusBar()->addPermanentWidget(statusLabel);
    statusBar()->addPermanentWidget(MousePosLabel);

    setWindowTitle(tr("鼠标事件"));
    setMouseTracking(true);
    resize(400,200);
}

void MouseEvent::mousePressEvent(QMouseEvent *e) {
    if(e->button()==Qt::LeftButton) {
        statusBar()->showMessage(tr("左键单击:(%1, %2)").arg(e->x()).arg(e->y()));
    }else if(e->buttons() & Qt::RightButton) {
        statusBar()->showMessage(tr("右键单击:(%1, %2)").arg(e->x()).arg(e->y()));
    }else if(e->buttons() & Qt::MidButton) {
        statusBar()->showMessage(tr("中键单击:(%1, %2)").arg(e->x()).arg(e->y()));
    }
}

void MouseEvent::mouseMoveEvent(QMouseEvent *e) {
    MousePosLabel->setText(QString("(%1, %2)").arg(e->x()).arg(e->y()));
}

void MouseEvent::mouseReleaseEvent(QMouseEvent *e) {
    statusBar()->showMessage(tr("释放:(%1, %2)").arg(e->x()).arg(e->y()), 3000);
}

void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e) {
    if(e->buttons() & Qt::LeftButton) {
        statusBar()->showMessage(tr("左键双击:(%1, %2)").arg(e->x()).arg(e->y()));
    }else if(e->buttons() & Qt::RightButton) {
        statusBar()->showMessage(tr("右键双击:(%1, %2)").arg(e->x()).arg(e->y()));
    }else if(e->button()==Qt::MidButton) {
        statusBar()->showMessage(tr("中键双击:(%1, %2)").arg(e->x()).arg(e->y()));
    }
}

void MouseEvent::wheelEvent(QWheelEvent *e) {
    statusBar()->showMessage(tr("滚动:%1").arg(e->delta()));
}
键盘事件

image.png

KeyEvent.pro

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = KeyEvent
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp 
        keyevent.cpp

HEADERS  += keyevent.h

main.cpp

#include "keyevent.h"
#include 

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    KeyEvent w;
    w.show();

    return a.exec();
}

keyevent.h

#ifndef KEYEVENT_H
#define KEYEVENT_H

#include 
#include 
#include 

class KeyEvent : public QWidget {
    Q_OBJECT
public:
    explicit KeyEvent(QWidget *parent = 0);
    void drawPix();
    void keyPressEvent(QKeyEvent *);
    void paintEvent(QPaintEvent *);
private:
    QPixmap *pix;		//作为一个绘图设备,使用双缓冲机制实现图形的绘制
    QImage image;		//界面中间的小图标
    
    int startX;
    int startY;
    
    int width;
    int height;
    int step;			//网格的大小,即移动的步进值
};

#endif // KEYEVENT_H

keyevent.cpp

#include "keyevent.h"
#include 

KeyEvent::KeyEvent(QWidget *parent) : QWidget(parent) {
    setWindowTitle(tr("键盘事件"));
    setAutoFillBackground(true);

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

    setFixedSize(512, 256);

    width = size().width();
    height = size().height();
    pix = new QPixmap(width, height);
    image.load("image.png");
    startX = 100;
    startY = 100;
    step = 20;

    drawPix();
}

void KeyEvent::drawPix() {
    pix->fill(Qt::white);

    QPainter painter(pix);
    painter.setPen(QPen(Qt::DotLine));
    for(int i=step; imodifiers() == Qt::ControlModifier) {
        if(event->key() == Qt::Key_Left) {
            startX = (startX-1<0)?startX:startX-1;
        } else if(event->key() == Qt::Key_Right) {
            startX = (startX+1+image.width()>width)?startX:startX+1;
        } else if(event->key() == Qt::Key_Up) {
            startY = (startY-1<0)?startY:startY-1;
        } else if(event->key() == Qt::Key_Down) {
            startY = (startY+1+image.height()>height)?startY:startY+1;
        }
    } else {
        startX = startX-startX%step;
        startY = startY-startY%step;
        if(event->key() == Qt::Key_Left) {
            startX = (startX-step<0)?startX:startX-step;
        } else if(event->key() == Qt::Key_Right) {
            startX = (startX+step+image.width()>width)?startX:startX+step;
        } else if(event->key() == Qt::Key_Up) {
            startY = (startY-step<0)?startY:startY-step;
        } else if(event->key() == Qt::Key_Down) {
            startY = (startY+step+image.height()>height)?startY:startY+step;
        } else if(event->key() == Qt::Key_Home)	{
            startX = 0;
            startY = 0;
        } else if(event->key() == Qt::Key_End) {
            startX = width-image.width();
            startY = height-image.height();
        }
    }
    drawPix();
    update();
}

void KeyEvent::paintEvent(QPaintEvent *) {
    QPainter painter(this);
    painter.drawPixmap(QPoint(0, 0), *pix);
}
事件过滤

1.png

2.png

3.png

EventFliter.pro

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = EventFilter
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp 
        eventfilter.cpp

HEADERS  += eventfilter.h

main.cpp

#include "eventfilter.h"
#include 

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    EventFilter w;
    w.show();

    return a.exec();
}

eventfliter.h

#ifndef EVENTFILTER_H
#define EVENTFILTER_H

#include 
#include 
#include 
#include 
#include 
#include 

class EventFilter : public QDialog {
    Q_OBJECT
public:
    explicit EventFilter(QWidget *parent = 0, Qt::WindowFlags f=0);
public slots:
    bool eventFilter(QObject *, QEvent *);
private:
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;
    QLabel *stateLabel;
    QImage Image1;
    QImage Image2;
    QImage Image3;
    QHBoxLayout *layout;
    QVBoxLayout *mainLayout;
};

#endif // EVENTFILTER_H

eventfliter.cpp

#include "eventfilter.h"
#include 
#include 

EventFilter::EventFilter(QWidget *parent,Qt::WindowFlags f) : QDialog(parent,f) {
    setWindowTitle(tr("事件过滤"));

    Image1.load("1.png");
    Image2.load("2.png");
    Image3.load("3.png");

    label1 = new QLabel;
    label1->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label1->setPixmap(QPixmap::fromImage(Image1));

    label2 = new QLabel;
    label2->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label2->setPixmap(QPixmap::fromImage(Image2));

    label3 = new QLabel;
    label3->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label3->setPixmap(QPixmap::fromImage(Image3));

    layout=new QHBoxLayout;
    layout->addWidget(label1);
    layout->addWidget(label2);
    layout->addWidget(label3);

    stateLabel = new QLabel(tr("鼠标按下标志"));
    stateLabel->setAlignment(Qt::AlignHCenter);

    mainLayout = new QVBoxLayout(this);
    mainLayout->addLayout(layout);
    mainLayout->addWidget(stateLabel);

    label1->installEventFilter(this);
    label2->installEventFilter(this);
    label3->installEventFilter(this);
}

bool EventFilter::eventFilter(QObject *watched, QEvent *event) {
    if(watched == label1) {
        if(event->type() == QEvent::MouseButtonPress) {
            QMouseEvent *mouseEvent = (QMouseEvent *)event;
            if(mouseEvent->buttons() & Qt::LeftButton)
                stateLabel->setText(tr("左键按下左边图片"));
            else if(mouseEvent->buttons() & Qt::MidButton)
                stateLabel->setText(tr("中键按下左边图片"));
            else if(mouseEvent->buttons() & Qt::RightButton)
                stateLabel->setText(tr("右键按下左边图片"));

            QMatrix matrix;
            matrix.scale(0.8, 0.8);
            QImage tmpImg = Image1.transformed(matrix);
            label1->setPixmap(QPixmap::fromImage(tmpImg));
        } else if(event->type() == QEvent::MouseButtonRelease) {
            stateLabel->setText(tr("鼠标释放左边图片"));
            label1->setPixmap(QPixmap::fromImage(Image1));
        }
    } else if(watched == label2) {
        if(event->type() == QEvent::MouseButtonPress) {
            QMouseEvent *mouseEvent = (QMouseEvent *)event;
            if(mouseEvent->buttons() & Qt::LeftButton)
                stateLabel->setText(tr("左键按下中间图片"));
            else if(mouseEvent->buttons()&Qt::MidButton)
                stateLabel->setText(tr("中键按下中间图片"));
            else if(mouseEvent->buttons()&Qt::RightButton)
                stateLabel->setText(tr("右键按下中间图片"));
            QMatrix matrix;
            matrix.scale(1.0, 1.0);
            QImage tmpImg = Image2.transformed(matrix);
            label2->setPixmap(QPixmap::fromImage(tmpImg));
        } else if(event->type() == QEvent::MouseButtonRelease) {
            stateLabel->setText(tr("鼠标释放中间图片"));
            label2->setPixmap(QPixmap::fromImage(Image2));
        }
    } else if(watched == label3) {
        if(event->type() == QEvent::MouseButtonPress) {
            QMouseEvent *mouseEvent = (QMouseEvent *)event;
            if(mouseEvent->buttons() & Qt::LeftButton)
                stateLabel->setText(tr("左键按下右边图片"));
            else if(mouseEvent->buttons() & Qt::MidButton)
                stateLabel->setText(tr("中键按下右边图片"));
            else if(mouseEvent->buttons() & Qt::RightButton)
                stateLabel->setText(tr("右键按下右边图片"));
            QMatrix matrix;
            matrix.scale(1.25, 1.25);
            QImage tmpImg = Image3.transformed(matrix);
            label3->setPixmap(QPixmap::fromImage(tmpImg));
        } else if(event->type() == QEvent::MouseButtonRelease) {
            stateLabel->setText(tr("鼠标释放右边图片"));
            label3->setPixmap(QPixmap::fromImage(Image3));
        }
    }

    return QDialog::eventFilter(watched, event);
}
鼠标悬停事件

QEvent::HoverEnter
QEvent::HoverMove
QEvent::HoverLeave
QEvent::Enter

鼠标事件穿透
trackPointLabel.setAttribute(Qt::WA_TransparentForMouseEvents,true)

//在构造函数中
ui->btnGetRadarPara->setAttribute(Qt::WA_Hover, true); //开启悬停事件
ui->btnGetRadarPara->installEventFilter(this); //安装事件过滤器

ui->btnGetTargetInfo->setAttribute(Qt::WA_Hover, true); //开启悬停事件
ui->btnGetTargetInfo->installEventFilter(this); 
//安装事件过滤器
bool RadarExternalPlatForm::eventFilter(QObject * obj, QEvent * event)
    {


        if(obj == ui->btnGetRadarPara)
        {
            if(event->type() == QEvent::HoverEnter) //当鼠标悬停在获取雷达参数按钮上
            {
                m_pRadarLoader->SendGetCurRadarParamtersReqMsg(ui->editPlatFromID->text().toInt()); //获取雷达参数
                return true;
            }
        }
  }
右键菜单事件

控件设置上下文菜单策略 setContextMenuPolicy(Qt::CustomContextMenu) ;

右键点击控件时发送 void QWidget::customContextMenuRequested(const QPoint &pos) 信号
pos传递鼠标坐标,相对于控件左上角而言

//初始化动作
QAction *buttonAction1 = new QAction("btnFirstAction",this);
QAction *buttonAction2 = new QAction("btnSecondAction",this);
//初始化菜单
QMenu *buttonMenu = new QMenu(this);
//动作添加到菜单
buttonMenu->addAction(buttonAction1);
buttonMenu->addAction(buttonAction2);

QAction *lableAction1 = new QAction("lbFirstAction",this);
QAction *lableAction2 = new QAction("lbSecondAction",this);
QMenu *lableMenu = new QMenu(this);
lableMenu->addAction(lableAction1);
lableMenu->addAction(lableAction2);

//给动作设置信号槽
connect( buttonAction1, &QAction::triggered, [=]()
{
    qDebug()<<"I'm btnFirstAction";
});
connect( buttonAction2, &QAction::triggered, [=]()
{
    qDebug()<<"I'm btnSecondAction";
});
connect( lableAction1, &QAction::triggered, [=]()
{
    qDebug()<<"I'm lbFirstAction";
});
connect( lableAction2, &QAction::triggered, [=]()
{
    qDebug()<<"I'm lbSecondAction";
});

//给控件设置上下文菜单策略
ui->label->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->label, &QLabel::customContextMenuRequested, [=](const QPoint &pos)
{
    qDebug()<exec(QCursor::pos());
});

ui->pushButton->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->pushButton,&QPushButton::customContextMenuRequested,[=](const QPoint &pos)
{
    qDebug()<exec(QCursor::pos());
});
拖曳事件
this->setAcceptDrops(true);

//拖拽进入事件
void GLWidget::dragEnterEvent(QDragEnterEvent *event)
{

//toolbox* source = qobject_cast(event->source());

//event->mimeData()->hasUrls()


    if(!event->mimeData()->urls()[0].fileName().right(3).compare("jpg")  || !event->mimeData()->urls()[0].fileName().right(3).compare("png") ||
       !event->mimeData()->urls()[0].fileName().right(4).compare("jpeg") || !event->mimeData()->urls()[0].fileName().right(3).compare("bmp")){
        event->acceptProposedAction();
    }
    else{
        event->ignore();//否则不接受鼠标事件
    }
}
//拖拽移动事件
void GLWidget::dragMoveEvent(QDragMoveEvent *event)
{
    Q_UNUSED(event);
    event->setDropAction(Qt::MoveAction);
    event->accept();
}
 
//拖拽放下事件
void GLWidget::dropEvent(QDropEvent *event)
{
 
    const QMimeData *qm=event->mimeData();//获取MIMEData
    const QString Path = qm->urls()[0].toLocalFile();//是获取拖动文件的本地路径。
    emit dropPic(Path);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/529350.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号