Qt实现鼠标拖动窗口
Qt实现鼠标拖动窗口
- 1、设置窗口无边框
- 2、重写鼠标点击,移动函数
- 2.1添加头文件
- 2.2 重写函数
- 2.3 添加定义
- 3、定义一个偏移值
- 4、判断鼠标左键是否按下并计算偏移值
- 5、移动窗口
- 6、.h文件和.cpp文件
- 6.1 .h文件
- 6.2 .cpp文件
- 7、总结
1、设置窗口无边框
this->setWindowFlag(Qt::FramelessWindowHint); //设置窗口无边框
2、重写鼠标点击,移动函数
2.1添加头文件
2.2 重写函数
2.3 添加定义
//鼠标移动事件
void wearherMainInterface::mouseMoveEvent(QMouseEvent *event)
{
}
3、定义一个偏移值
4、判断鼠标左键是否按下并计算偏移值
//鼠标点击事件
void wearherMainInterface::mousePressEvent(QMouseEvent *event)
{
//判断右键是否按下
if(event->button() == Qt::RightButton)
{
quitMenu->exec(QCursor::pos()); //当前鼠标位置显示菜单
}
//判断左键是否按下
if(event->button() == Qt::LeftButton)
{
}
}
5、移动窗口
//鼠标移动事件
void wearherMainInterface::mouseMoveEvent(QMouseEvent *event)
{
this->move(event->globalPos() - moffset); //移动窗口
}
6、.h文件和.cpp文件
6.1 .h文件
#ifndef WEARHERMAININTERFACE_H
#define WEARHERMAININTERFACE_H
#include <QWidget>
#include <QMouseEvent>
#include <QMenu>
#include <QAction>
#include <QMessageBox>
namespace Ui {
class wearherMainInterface;
}
class wearherMainInterface : public QWidget
{
Q_OBJECT
public:
explicit wearherMainInterface(QWidget *parent = nullptr);
~wearherMainInterface();
protected:
void mousePressEvent(QMouseEvent *event) override; //重写鼠标点击事件
void mouseMoveEvent(QMouseEvent *event) override; //重写鼠标移动事件
private slots:
void on_quitPushButton_clicked(); //退出按钮
void quitMenuTriggered(); //菜单被触发后处理槽函数
private:
Ui::wearherMainInterface *ui;
QMenu *quitMenu; //创建退出菜单指针
QPoint moffset; //鼠标与窗口左上角的偏移值
};
#endif // WEARHERMAININTERFACE_H
6.2 .cpp文件
#include "wearhermaininterface.h"
#include "ui_wearhermaininterface.h"
wearherMainInterface::wearherMainInterface(QWidget *parent) :
QWidget(parent),
ui(new Ui::wearherMainInterface)
{
ui->setupUi(this);
this->setWindowFlag(Qt::FramelessWindowHint); //去边框
// this->setAttribute(Qt::WA_TranslucentBackground); //半透明背景
quitMenu = new QMenu(this); //创建菜单对象
QAction *quitAction = new QAction(QIcon(":/widdgetMainInterface/exit.png"),"退出",this);
quitMenu->addAction(quitAction); //菜单添加动作对象
//连接菜单被触发的信号与槽
connect(quitMenu,&QMenu::triggered,this,&wearherMainInterface::quitMenuTriggered);
}
wearherMainInterface::~wearherMainInterface()
{
delete ui;
}
//鼠标点击事件
void wearherMainInterface::mousePressEvent(QMouseEvent *event)
{
//判断右键是否按下
if(event->button() == Qt::RightButton)
{
quitMenu->exec(QCursor::pos()); //当前鼠标位置显示菜单
}
//判断左键是否按下
//当前鼠标位置 event->globalPos()
//当前窗口位置 this->pos()
if(event->button() == Qt::LeftButton)
{
moffset = event->globalPos() - this->pos(); //当前鼠标位置减去当前窗口位置得到偏移值
}
}
//鼠标移动事件
void wearherMainInterface::mouseMoveEvent(QMouseEvent *event)
{
this->move(event->globalPos() - moffset); //移动窗口
}
//退出按钮
void wearherMainInterface::on_quitPushButton_clicked()
{
QMessageBox quitMes; //创建退出弹窗对象
quitMes.setWindowTitle("关闭界面"); //弹窗标题
quitMes.setWindowIcon(QIcon(":/widdgetMainInterface/MesPanda.png")); //设置窗口图标
quitMes.setIcon(QMessageBox::Warning); //弹窗图片
quitMes.setText("是否关闭弹窗"); //弹窗文本
quitMes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); //设置Ok和Cancle两个按钮
quitMes.setButtonText(QMessageBox::Ok, "确认"); //Ok改为确认
quitMes.setButtonText(QMessageBox::Cancel,"取消"); //Cancle改为取消
int result = quitMes.exec(); //显示信息框等待用户交互
//如果用户选择了Ok
if(result == QMessageBox::Ok)
{
this->close(); //关闭主界面
}
else //用户取消什么都不做
{
}
}
//菜单被触发后槽函数
void wearherMainInterface::quitMenuTriggered()
{
QMessageBox quitMes; //创建退出弹窗对象
quitMes.setWindowTitle("关闭界面"); //弹窗标题
quitMes.setWindowIcon(QIcon(":/widdgetMainInterface/MesPanda.png")); //设置窗口图标
quitMes.setIcon(QMessageBox::Warning); //弹窗图片
quitMes.setText("是否关闭弹窗"); //弹窗文本
quitMes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); //设置Ok和Cancle两个按钮
quitMes.setButtonText(QMessageBox::Ok, "确认"); //Ok改为确认
quitMes.setButtonText(QMessageBox::Cancel,"取消"); //Cancle改为取消
int result = quitMes.exec(); //显示信息框等待用户交互
//如果用户选择了Ok
if(result == QMessageBox::Ok)
{
this->close(); //关闭界面
}
else //用户取消什么都不做
{
}
}
7、总结
以上就是Qt实现鼠标拖动窗口的整个过程了,浏览过程中,如若发现错误,欢迎大家指 正,有问题的可以评论区留言或者私信。.h文件和.cpp文件中还有一些别的功能,大家 可以选择性参考 最后,如果大家觉得有所帮助的话,可以点个赞,谢谢大家!梦虽遥, 追则能达;愿虽艰,持则可圆! |