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

相关推荐
奥修的灵魂几秒前
QT进阶之路:带命名空间的自定义控件在Qt设计器与qss中的使用技巧
qt·命名空间
Channing Lewis38 分钟前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠38 分钟前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT43 分钟前
每日八股文6.3
数据库·sql
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes1 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
tonexuan2 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan2 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql