目录
一、设置窗口无边框
setWindowFlag(Qt::FramelessWindowHint); // 设置窗口无边框
二、重写右键菜单事件
void MainWindow::contextMenuEvent(QContextMenuEvent *event) {
// 弹出右键菜单
mExitMenu->exec(event->globalPos());
// 标记事件已被处理
event->accept();
}
三、添加菜单控件
// 构建右键菜单
mExitMenu = new QMenu(this);
mExitAct = new QAction();
// 添加菜单项
mExitAct->setText("退出");
mExitAct->setIcon(QIcon(":/res/close.png"));
mExitMenu->addAction(mExitAct);
四、软件退出
connect(mExitAct, &QAction::triggered, qApp, &QApplication::quit);
五、窗口随鼠标移动
void MainWindow::mousePressEvent(QMouseEvent *event)
{
// event->globalPos():鼠标相对于整个屏幕的坐标
// this->pos():窗口左上角相对于整个屏幕的坐标(窗口是指你的界面)
// mOffset:以整个屏幕为基准,鼠标相对于窗口左上角的偏移量
mOffset = event->globalPos() - this->pos();
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
this->move(event->globalPos() - mOffset);
}
六、完整代码
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QContextMenuEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void contextMenuEvent(QContextMenuEvent *event); //重写父类的虚函数
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
private:
Ui::MainWindow *ui;
QMenu* mExitMenu; // 右键退出的菜单
QAction* mExitAct; // 退出的行为 - 菜单项
QPoint mOffset; //窗口移动时,鼠标与窗口左上角的偏移
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlag(Qt::FramelessWindowHint); // 设置窗口无边框
// setFixedSize(width(), height()); // 设置固定窗口大小
// 构建右键菜单
mExitMenu = new QMenu(this);
mExitAct = new QAction();
// 添加菜单项
mExitAct->setText("退出");
mExitAct->setIcon(QIcon(":/res/close.png"));
mExitMenu->addAction(mExitAct);
connect(mExitAct, &QAction::triggered, qApp, &QApplication::quit);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 重写父类的虚函数
// 父类中默认的实现 是忽略右键菜单事件
// 重写之后,就可以处理右键菜单
void MainWindow::contextMenuEvent(QContextMenuEvent *event) {
// 弹出右键菜单
mExitMenu->exec(event->globalPos());
// 标记事件已被处理
event->accept();
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
// event->globalPos():鼠标相对于整个屏幕的坐标
// this->pos():窗口左上角相对于整个屏幕的坐标(窗口是指你的界面)
// mOffset:以整个屏幕为基准,鼠标相对于窗口左上角的偏移量
mOffset = event->globalPos() - this->pos();
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
this->move(event->globalPos() - mOffset);
}