作者:WenFJ | 来源:互联网 | 2023-09-02 13:08
一、鼠标拖动控件鼠标拖动实现采用事件监听器来实现。1.1、效果展示1.2、详细代码mainwindows.h#ifndefMAINWINDOW_H#defineMAINWI
一、鼠标拖动控件
鼠标拖动实现采用事件监听器来实现。
1.1、效果展示
1.2、详细代码
mainwindows.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include
#include
#include
#include
#include
#include
#include namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent &#61; 0);~MainWindow();QWidget* celWidget;QHBoxLayout* mainLayout;QPushButton* Btn;QList<QPushButton*> btn_group;public slots:bool eventFilter(QObject *obj, QEvent *evt);private:Ui::MainWindow *ui;
};#endif
mainwindows.c
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);celWidget &#61; new QWidget(this);mainLayout &#61; new QHBoxLayout(celWidget);for(int i&#61;0; i<3; i&#43;&#43;) {Btn &#61; new QPushButton(QString("%1").arg(i&#43;1));btn_group.push_back(Btn);Btn->installEventFilter(this);mainLayout->addWidget(Btn);}this->setCentralWidget(celWidget);
}MainWindow::~MainWindow()
{delete ui;for(int i&#61;0; i<3; i&#43;&#43;) {QPushButton* btn &#61; btn_group[i];delete btn;btn &#61; nullptr;}
}bool MainWindow::eventFilter(QObject *obj, QEvent *evt)
{QPushButton* btn &#61; nullptr;btn &#61; qobject_cast<QPushButton*>(obj);if(btn&#61;&#61;nullptr)return false;static QPoint lastPnt;static bool isHover &#61; false;if(evt->type() &#61;&#61; QEvent::MouseButtonPress) {QMouseEvent* e &#61; static_cast<QMouseEvent*>(evt);if(btn->rect().contains(e->pos()) && (e->button() &#61;&#61; Qt::LeftButton)){lastPnt &#61; e->pos();isHover &#61; true;}}else if(evt->type() &#61;&#61; QEvent::MouseMove && isHover){ QMouseEvent* e &#61; static_cast<QMouseEvent*>(evt);int dx &#61; e->pos().x() - lastPnt.x();int dy&#61;e->pos().y()-lastPnt.y();btn->move(btn->x()&#43;dx,btn->y()&#43;dy);}else if(evt->type() &#61;&#61; QEvent::MouseButtonRelease && isHover){ isHover &#61; false;}return false;
}
二、鼠标拖动窗体
鼠标拖动窗体采用重写鼠标按下事件、鼠标移动事件和鼠标释放事件来实现。
2.1、效果展示
2.2、详细代码
mainwindows.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include
#include namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent &#61; 0);~MainWindow();void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);bool m_pDrag;QPoint mouse_press_pos;QPoint windowTopLeft_pos;private:Ui::MainWindow *ui;
};#endif
mainwindows.c
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_pDrag &#61; false;mouse_press_pos &#61; QPoint(0,0);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::mousePressEvent(QMouseEvent *event)
{if(event->button() &#61;&#61; Qt::LeftButton){m_pDrag &#61; true;mouse_press_pos &#61; event->globalPos();windowTopLeft_pos &#61; this->frameGeometry().topLeft();}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{if(m_pDrag){QPoint Distance &#61; event->globalPos() - mouse_press_pos;this->move(windowTopLeft_pos &#43; Distance);}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{if(event->button() &#61;&#61; Qt::LeftButton)m_pDrag &#61; false;
}