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_OBJECTpublic: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(); //显示信息框等待用户交互//如果用户选择了Okif(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(); //显示信息框等待用户交互//如果用户选择了Okif(result == QMessageBox::Ok){this->close(); //关闭界面}else //用户取消什么都不做{}
}
7、总结
以上就是Qt实现鼠标拖动窗口的整个过程了,浏览过程中,如若发现错误,欢迎大家指 正,有问题的可以评论区留言或者私信。.h文件和.cpp文件中还有一些别的功能,大家 可以选择性参考 最后,如果大家觉得有所帮助的话,可以点个赞,谢谢大家!梦虽遥, 追则能达;愿虽艰,持则可圆! |