Qt天气预报系统界面关闭
1、点击右上角x退出 1.1添加控件 1.2修改控件名字 1.3编程实现控件功能
2、鼠标右键退出 2.1重写鼠标点击事件 2.2添加定义 2.3添加一个菜单 2.3.1创建一个菜单指针 2.3.2创建一个菜单对象 2.3.3显示菜单 2.3.4定义一个菜单退出动作 2.3.5在当前鼠标位置显示菜单 2.3.6连接信号与槽 2.3.7新增菜单被触发后进行处理的槽函数 2.3.8添加槽函数的定义 2.3.9把弹窗那部分代码添加进去 2.3.10连接菜单被触发的信号与槽 2.3.10整合代码
3、该功能实现的.h文件和.cpp文件
4、结论
1、点击右上角x退出
1.1添加控件
拖入一个pushButton
放到右上角,然后把里面的文本删掉
添加资源文件,找到icon
,把关闭这个图片加入进去
1.2修改控件名字
1.3编程实现控件功能
void MainWindow :: on_pushButton_quit_clicked ( )
{
QMessageBox mes;
mes. setWindowTitle ( "关闭窗口" ) ;
mes. setIcon ( QMessageBox:: Warning) ;
mes. setText ( "是否关闭窗口?" ) ;
mes. setStandardButtons ( QMessageBox:: Ok | QMessageBox:: Cancel) ;
mes. setWindowIcon ( QIcon ( ":/widget/dog.png" ) ) ;
mes. setButtonText ( QMessageBox:: Ok, tr ( "确定" ) ) ;
mes. setButtonText ( QMessageBox:: Cancel, tr ( "取消" ) ) ;
int result = mes. exec ( ) ;
if ( result == QMessageBox:: Ok) {
this -> close ( ) ;
}
}
代码添加了注释,方便大家理解与学习,有不懂的可以评论区留言或者私信
2、鼠标右键退出
2.1重写鼠标点击事件
protected :
void mousePressEvent ( QMouseEvent * event) ;
2.2添加定义
把鼠标放到这个函数上,ALT+Enter 选择添加头文件
再把鼠标放到QMouseEvent 上,选择添加头文件
2.3添加一个菜单
2.3.1创建一个菜单指针
private :
Ui:: MainWindow * ui;
QMenu * quitMenu;
把鼠标放到这个QMenu 上,ALT+Enter 选择添加头文件
2.3.2创建一个菜单对象
quitMenu = new QMenu ( this ) ;
2.3.3显示菜单
void MainWindow :: mousePressEvent ( QMouseEvent * event)
{
if ( event-> button ( ) == Qt:: RightButton)
{
quitMenu-> exec ( ) ;
}
}
2.3.4定义一个菜单退出动作
QAction * quitAct = new QAction ( QIcon ( ":/widget/quit.png" ) , tr ( "退出" ) , this ) ;
quitMenu-> addAction ( quitAct) ;
2.3.5在当前鼠标位置显示菜单
void MainWindow :: mousePressEvent ( QMouseEvent * event)
{
if ( event-> button ( ) == Qt:: RightButton)
{
quitMenu-> exec ( QCursor :: pos ( ) ) ;
}
}
2.3.6连接信号与槽
connect ( quitMenu, & QMenu:: triggered, this , [ = ] {
this -> close ( ) ;
} ) ;
这样基本就能实现关闭的功能,不过为了把弹窗加进去,还得进行优化
2.3.7新增菜单被触发后进行处理的槽函数
private slots:
void on_pushButton_quit_clicked ( ) ;
void onQuitActTriggered ( ) ;
2.3.8添加槽函数的定义
把鼠标放到这个槽函数 上,ALT+Enter 选择添加定义
2.3.9把弹窗那部分代码添加进去
void MainWindow :: onQuitActTriggered ( )
{
QMessageBox mes;
mes. setWindowTitle ( "关闭窗口" ) ;
mes. setIcon ( QMessageBox:: Warning) ;
mes. setText ( "是否关闭窗口?" ) ;
mes. setStandardButtons ( QMessageBox:: Ok | QMessageBox:: Cancel) ;
mes. setWindowIcon ( QIcon ( ":/widget/dog.png" ) ) ;
mes. setButtonText ( QMessageBox:: Ok, tr ( "确定" ) ) ;
mes. setButtonText ( QMessageBox:: Cancel, tr ( "取消" ) ) ;
int result = mes. exec ( ) ;
if ( result == QMessageBox:: Ok) {
this -> close ( ) ;
}
}
2.3.10连接菜单被触发的信号与槽
connect ( quitMenu, & QMenu:: triggered, this , & MainWindow:: onQuitActTriggered) ;
成功运行,也实现想要的功能,成功把弹窗功能添加进去
2.3.10整合代码
private :
Ui:: MainWindow * ui;
QMenu * quitMenu;
bool closePOPWindow ( ) ;
把鼠标放到这个函数 上,ALT+Enter 选择添加定义
bool MainWindow :: closePOPWindow ( )
{
QMessageBox mes;
mes. setWindowTitle ( "关闭窗口" ) ;
mes. setIcon ( QMessageBox:: Warning) ;
mes. setText ( "是否关闭窗口?" ) ;
mes. setStandardButtons ( QMessageBox:: Ok | QMessageBox:: Cancel) ;
mes. setWindowIcon ( QIcon ( ":/widget/dog.png" ) ) ;
mes. setButtonText ( QMessageBox:: Ok, tr ( "确定" ) ) ;
mes. setButtonText ( QMessageBox:: Cancel, tr ( "取消" ) ) ;
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 ( ) ;
}
3、该功能实现的.h文件和.cpp文件
3.1 .h文件
# 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 ( ) ;
void onQuitActTriggered ( ) ;
private :
Ui:: MainWindow * ui;
QMenu * quitMenu;
QAction * quitAct;
bool closePOPWindow ( ) ;
} ;
# endif
3.2 .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) ;
quitMenu = new QMenu ( this ) ;
quitAct = new QAction ( QIcon ( ":/widget/quit.png" ) , tr ( "退出" ) , this ) ;
quitMenu-> addAction ( quitAct) ;
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. setIcon ( QMessageBox:: Warning) ;
mes. setText ( "是否关闭窗口?" ) ;
mes. setStandardButtons ( QMessageBox:: Ok | QMessageBox:: Cancel) ;
mes. setWindowIcon ( QIcon ( ":/widget/dog.png" ) ) ;
mes. setButtonText ( QMessageBox:: Ok, tr ( "确定" ) ) ;
mes. setButtonText ( QMessageBox:: Cancel, tr ( "取消" ) ) ;
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文件放在了 文章末尾,浏览过程中,如若发现错误,欢迎大家指正,有问题的可以评论区留言或者 私信,谢谢大家!