热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QT鼠标拖动控件和窗体

一、鼠标拖动控件鼠标拖动实现采用事件监听器来实现。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 // MAINWINDOW_H


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)
{//可以判断obj的类型&#xff0c;然后转化成对应的类型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 // MAINWINDOW_H


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;
}

推荐阅读
author-avatar
WenFJ
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有