Qt天气预报系统界面关闭

Qt天气预报系统界面关闭

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文件放在了 文章末尾,浏览过程中,如若发现错误,欢迎大家指正,有问题的可以评论区留言或者 私信,谢谢大家! |

相关推荐
艾莉丝努力练剑6 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
还债大湿兄2 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
StarRocks_labs2 小时前
StarRocks Community Monthly Newsletter (Jun)
数据库·starrocks·数据湖·物化视图·存算分离
光电的一只菜鸡3 小时前
ubuntu之坑(十五)——设备树
linux·数据库·ubuntu
ob熔天使——武3 小时前
MySQL
数据库·mysql
小光学长4 小时前
基于vue框架的防疫物资仓库管理系统09y38(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
倔强青铜34 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian4 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼5 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上5 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt