Qt天气预报系统界面关闭
- 1、点击右上角x退出
- 2、鼠标右键退出
- 2.1重写鼠标点击事件
- 2.2添加定义
- 2.3添加一个菜单
- 3、该功能实现的.h文件和.cpp文件
-
- [3.1 .h文件](#3.1 .h文件)
- [3.2 .cpp文件](#3.2 .cpp文件)
- 4、结论
1、点击右上角x退出
1.1添加控件
|-----------------------------------|
| 拖入一个pushButton
放到右上角,然后把里面的文本删掉 |
|------------|
| 再把宽度,高度固定住 |
|------------------------------|
| 添加资源文件,找到icon
,把关闭这个图片加入进去 |
1.2修改控件名字
|----------------|
| 修改控件名字,方便后面的编程 |
1.3编程实现控件功能
|------------------|
| 选择按钮控件,右键选择转到槽
|
|---------------|
| 选择clicked()
|
|-------------|
| 下面是实现该功能的代码 |
cpp
void MainWindow::on_pushButton_quit_clicked()
{
// 创建一个消息框询问用户是否真的要退出
QMessageBox mes;
mes.setWindowTitle("关闭窗口");
// mes.setWindowFlags(Qt::Drawer); //把标题栏去掉
mes.setIcon(QMessageBox::Warning); //设置一个警告图片
mes.setText("是否关闭窗口?"); //弹窗文本
mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); //设置两个按钮
mes.setWindowIcon(QIcon(":/widget/dog.png")); // 设置窗口图标
mes.setButtonText(QMessageBox::Ok, tr("确定")); //ok改为确认
mes.setButtonText(QMessageBox::Cancel, tr("取消")); //Cancel改为取消
// 显示消息框并等待用户交互
int result = mes.exec();
// 根据用户的选择执行相应的操作
if (result == QMessageBox::Ok) {
// 用户选择了确定,关闭主窗口
this->close();
}
// 如果用户选择了取消,则不做任何事情,即不关闭主窗口
}
|-----------------------------------|
| 代码添加了注释,方便大家理解与学习,有不懂的可以评论区留言或者私信 |
2、鼠标右键退出
2.1重写鼠标点击事件
|--------------|
| 重写一下鼠标点击事件函数 |
cpp
protected:
void mousePressEvent(QMouseEvent *event); //重写鼠标点击事件函数
2.2添加定义
|------------------------------|
| 把鼠标放到这个函数上,ALT+Enter 选择添加头文件 |
|----------------------------|
| 再把鼠标放到QMouseEvent上,选择添加头文件 |
2.3添加一个菜单
2.3.1创建一个菜单指针
cpp
private:
Ui::MainWindow *ui;
QMenu *quitMenu;
|---------------------------------|
| 把鼠标放到这个QMenu上,ALT+Enter 选择添加头文件 |
2.3.2创建一个菜单对象
cpp
quitMenu = new QMenu(this); //创建一个QMenu对象
2.3.3显示菜单
cpp
void MainWindow::mousePressEvent(QMouseEvent *event)
{
//如果右键被按下
if(event->button() == Qt::RightButton)
{
quitMenu->exec(); //显示菜单
}
}
2.3.4定义一个菜单退出动作
cpp
QAction *quitAct = new QAction(QIcon(":/widget/quit.png"), tr("退出"), this); //定义一个退出动作
quitMenu->addAction(quitAct); //添加动作
2.3.5在当前鼠标位置显示菜单
cpp
void MainWindow::mousePressEvent(QMouseEvent *event)
{
//如果右键被按下
if(event->button() == Qt::RightButton)
{
quitMenu->exec(QCursor::pos()); //在当前鼠标位置显示菜单
}
}
2.3.6连接信号与槽
cpp
connect(quitMenu,&QMenu::triggered,this,[=]{
this->close();
}); //连接信号与槽
|---------------------------------|
| 这样基本就能实现关闭的功能,不过为了把弹窗加进去,还得进行优化 |
2.3.7新增菜单被触发后进行处理的槽函数
cpp
private slots:
void on_pushButton_quit_clicked(); //关闭UI界面
void onQuitActTriggered(); //菜单被点击后的处理
2.3.8添加槽函数的定义
|-----------------------------|
| 把鼠标放到这个槽函数上,ALT+Enter选择添加定义 |
2.3.9把弹窗那部分代码添加进去
cpp
void MainWindow::onQuitActTriggered()
{
// 创建一个消息框询问用户是否真的要退出
QMessageBox mes;
mes.setWindowTitle("关闭窗口");
// mes.setWindowFlags(Qt::Drawer); //把标题栏去掉
mes.setIcon(QMessageBox::Warning); //设置一个警告图片
mes.setText("是否关闭窗口?"); //弹窗文本
mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); //设置两个按钮
mes.setWindowIcon(QIcon(":/widget/dog.png")); // 设置窗口图标
mes.setButtonText(QMessageBox::Ok, tr("确定")); //ok改为确认
mes.setButtonText(QMessageBox::Cancel, tr("取消")); //Cancel改为取消
// 显示消息框并等待用户交互
int result = mes.exec();
// 根据用户的选择执行相应的操作
if (result == QMessageBox::Ok) {
// 用户选择了确定,关闭主窗口
this->close();
}
// 如果用户选择了取消,则不做任何事情,即不关闭主窗口
}
2.3.10连接菜单被触发的信号与槽
cpp
connect(quitMenu,&QMenu::triggered,this,&MainWindow::onQuitActTriggered); //连接菜单被触发的信号与槽
|---------------------------|
| 成功运行,也实现想要的功能,成功把弹窗功能添加进去 |
2.3.10整合代码
|-------------------|
| 把弹窗那部分功能代码整合成一个函数 |
cpp
private:
Ui::MainWindow *ui;
QMenu *quitMenu; //创建一个菜单指针
bool closePOPWindow(); //关闭窗口的弹窗
|----------------------------|
| 把鼠标放到这个函数上,ALT+Enter选择添加定义 |
|--------------|
| 把弹窗那部分代码添加进来 |
cpp
bool MainWindow::closePOPWindow()
{
// 创建一个消息框询问用户是否真的要退出
QMessageBox mes;
mes.setWindowTitle("关闭窗口");
// mes.setWindowFlags(Qt::Drawer); //把标题栏去掉
mes.setIcon(QMessageBox::Warning); //设置一个警告图片
mes.setText("是否关闭窗口?"); //弹窗文本
mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); //设置两个按钮
mes.setWindowIcon(QIcon(":/widget/dog.png")); // 设置窗口图标
mes.setButtonText(QMessageBox::Ok, tr("确定")); //ok改为确认
mes.setButtonText(QMessageBox::Cancel, tr("取消")); //Cancel改为取消
// 显示消息框并等待用户交互
int result = mes.exec();
// 根据用户的选择执行相应的操作
if (result == QMessageBox::Ok) {
// 用户选择了确定,关闭主窗口
this->close();
return true;
}
// 用户选择了取消,不关闭主窗口
else
{
return false; // 窗口关闭操作失败
}
}
新建的函数替代掉原本的功能
cpp
//右上角退出
void MainWindow::on_pushButton_quit_clicked()
{
closePOPWindow();
}
//鼠标右键退出
void MainWindow::onQuitActTriggered()
{
closePOPWindow();
}
3、该功能实现的.h文件和.cpp文件
3.1 .h文件
cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMenu>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void mousePressEvent(QMouseEvent *event); //重写鼠标点击事件函数
private slots:
void on_pushButton_quit_clicked(); //关闭UI界面
void onQuitActTriggered(); //菜单被点击后的处理
private:
Ui::MainWindow *ui;
QMenu *quitMenu; //创建一个菜单指针
QAction *quitAct; //定义一个动作
bool closePOPWindow(); //关闭窗口的弹窗
};
#endif // MAINWINDOW_H
3.2 .cpp文件
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlag(Qt::FramelessWindowHint);
// this->setLayout(ui->gridLayoutGlobal); //让界面随着窗口变幻大小
quitMenu = new QMenu(this); //创建一个QMenu对象
quitAct = new QAction(QIcon(":/widget/quit.png"), tr("退出"), this); //定义一个退出动作
quitMenu->addAction(quitAct); //添加动作
// connect(quitMenu,&QMenu::triggered,this,[=]{
// this->close();
// }); //连接信号与槽
connect(quitMenu,&QMenu::triggered,this,&MainWindow::onQuitActTriggered); //连接菜单被触发的信号与槽
}
MainWindow::~MainWindow()
{
delete ui;
}
//鼠标点击
void MainWindow::mousePressEvent(QMouseEvent *event)
{
//如果右键被按下
if(event->button() == Qt::RightButton)
{
quitMenu->exec(QCursor::pos()); //在当前鼠标位置显示菜单
}
}
//弹窗
bool MainWindow::closePOPWindow()
{
// 创建一个消息框询问用户是否真的要退出
QMessageBox mes;
mes.setWindowTitle("关闭窗口");
// mes.setWindowFlags(Qt::Drawer); //把标题栏去掉
mes.setIcon(QMessageBox::Warning); //设置一个警告图片
mes.setText("是否关闭窗口?"); //弹窗文本
mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); //设置两个按钮
mes.setWindowIcon(QIcon(":/widget/dog.png")); // 设置窗口图标
mes.setButtonText(QMessageBox::Ok, tr("确定")); //ok改为确认
mes.setButtonText(QMessageBox::Cancel, tr("取消")); //Cancel改为取消
// 显示消息框并等待用户交互
int result = mes.exec();
// 根据用户的选择执行相应的操作
if (result == QMessageBox::Ok) {
// 用户选择了确定,关闭主窗口
this->close();
return true;
}
// 用户选择了取消,不关闭主窗口
else
{
return false; // 窗口关闭操作失败
}
}
//右上角退出
void MainWindow::on_pushButton_quit_clicked()
{
closePOPWindow();
}
//鼠标右键退出
void MainWindow::onQuitActTriggered()
{
closePOPWindow();
}
界面关闭功能完成!
4、结论
|-----------------------------------------------------------------------------------------|
| 这个就是界面关闭的功能了,为了方便大家学习和理解,我把头文件和cpp文件放在了 文章末尾,浏览过程中,如若发现错误,欢迎大家指正,有问题的可以评论区留言或者 私信,谢谢大家! |