- 鼠标事件
- 键盘事件
- 事件过滤
- 鼠标悬停事件
- 右键菜单事件
- 拖曳事件
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" #includeint 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" #includeint 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; i modifiers() == 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" #includeint 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);
}



