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文件中還有一些別的功能,大家 可以選擇性參考 最后,如果大家覺得有所幫助的話,可以點個贊,謝謝大家!夢雖遙, 追則能達;愿雖艱,持則可圓! |