实现组件点击、释放、双击等事件和拖拽组件移动
代码如下
widge.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QKeyEvent>
#include <QWidget>
#include <QMouseEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void keyPressEvent(QKeyEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseDoubleClickEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
private:
Ui::Widget *ui;
QPoint temp;
};
#endif
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::keyPressEvent(QKeyEvent *event){
qDebug()<<event->key();
switch(event->key()){
case 'W':
case 'w':{
if(ui->label->y()<= -ui->label->height()){
ui->label->move(ui->label->x(),this->height());
}
ui->label->move(ui->label->x(),ui->label->y()-10);
}break;
case 'S':
case 's':{
if (ui->label->y() >= this->height()) {
ui->label->move(ui->label->x(), -ui->label->height());
}
ui->label->move(ui->label->x(),ui->label->y()+10);
}break;
case 'A':
case 'a':{
if(ui->label->x() <= -ui->label->width()){
ui->label->move(this->width(),ui->label->y());
}
ui->label->move(ui->label->x()-10,ui->label->y());
}break;
case 'D':
case 'd':{
if(ui->label->x() >= this->width()){
ui->label->move(-ui->label->width(),ui->label->y());
}
ui->label->move(ui->label->x()+10,ui->label->y());
}break;
}
}
void Widget::mousePressEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton){
qDebug()<<"按下鼠标左键,本地坐标:"<<event->pos()<<"全局坐标:"<<event->globalPos();
}else if(event->button() == Qt::RightButton){
qDebug()<<"按下鼠标右键,本地坐标:"<<event->pos()<<"全局坐标:"<<event->globalPos();
}else if(event->button() == Qt::MidButton){
qDebug()<<"按下鼠标中键,本地坐标:"<<event->pos()<<"全局坐标:"<<event->globalPos();
}
temp = event->pos() - ui->label->pos();
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug()<<"鼠标左键被抬起,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
}else if(event->button() == Qt::RightButton)
{
qDebug()<<"鼠标右键被抬起,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
}else if(event->button() == Qt::MidButton)
{
qDebug()<<"鼠标中间键被抬起,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
}
}
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug()<<"鼠标左键被双击,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
}else if(event->button() == Qt::RightButton)
{
qDebug()<<"鼠标右键被双击,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
}else if(event->button() == Qt::MidButton)
{
qDebug()<<"鼠标中间键被双击,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() == Qt::LeftButton)
{
qDebug()<<"鼠标左键被移动,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
ui->label->move(event->pos()-temp);
}else if(event->buttons() == Qt::RightButton)
{
qDebug()<<"鼠标右键被移动,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
this->close();
}else if(event->buttons() == Qt::MidButton)
{
qDebug()<<"鼠标中间键被移动,本地坐标:"<< event->pos() << "全局坐标:"<<event->globalPos();
}
}
运行结果
思维导图