`
mmdev
  • 浏览: 13109858 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

【Qt开发】Qt 捕捉窗口关闭事件与信号的捕捉

 
阅读更多
有时候我们希望在关闭窗口之前做一些操作,例如保存缓存数据或向用户提示是否关闭窗口等等。
由于一般的窗口都是继承自QWidget, 那么我们可以通过覆盖QWidget中的虚函数closeEvent(QCloseEvent* event);来达到这个目的。

(1)首先添加依赖库:
#include <QCloseEvent>

(2)接着声明和定义closeEvent函数:
a).h文件
protected:
     void closeEvent(QCloseEvent *event);

b).cpp文件
void MainWindow::closeEvent(QCloseEvent *event)
{
    //TODO: 在退出窗口之前,实现希望做的操作
}

刚刚将closeEvent应用在了一个小例子上面:
我在主进程中fork()了一个子进程,希望在关闭主窗口后(也就是主进程退出)结束子进程。那么这个时候一般的做法就是监听窗口的关闭事件;然后将要关闭的窗口向本身进程(父进程)发送SIGINT信号,主进程通过已注册好的信号捕捉函数来结束子进程。

代码演示:
(1)main.cpp文件
#include <QtGui/QApplication>
#include "mainwindow.h"

int pid_t pid;

pid_t child_make()
{
    pid_t p_id;

    if((pid = fork()) > 0)
    {
        return p_id;
    }

    //TODO: 以下是子进程的逻辑部分
}

// 结束子进程
void sig_int(int signal)
{
    kill(pid, SIGTERM);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    void sig_int(int);
    pid = child_make();
    // 注册捕捉SIGINT信号的函数 
    signal(SIGINT, sig_int);
   
    return a.exec();
}

(2)mainwindow.h文件
#include <QMainWindow>
#include <QCloseEvent>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
   
public:
    explicit MainWindow(QWidget *parent = 0);
    // 实现QWidget中的虚函数closeEvent(QCloseEvent*);
    void closeEvent(QCloseEvent *event);
    ~MainWindow();
   
private:
    Ui::MainWindow *ui;
};

(3)mainwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <signal.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 在closeEvent内实现具体逻辑
void MainWindow::closeEvent(QCloseEvent *event)
{
    // 向自身进程发送SIGINT信号,相当于raise(SIGINT);
    kill(getpid(), SIGINT);
}

分享到:
评论

相关推荐

    qt 系统钩子获取鼠标键盘事件

    在实际项目中,为了确保代码的可移植性,可以使用Qt的信号和槽机制来封装这些平台特定的实现,这样当底层事件发生时,可以触发Qt的信号,然后在Qt的对象模型中进行相应的处理。 总之,利用Qt结合系统API,我们能够...

    Qt 5.9 C++开发指南-Qt核心特点源码

    **Qt 5.9 C++ 开发指南:深入理解Qt核心特点与源码解析** Qt是一个流行的开源跨平台应用程序开发框架,广泛应用于桌面、移动和嵌入式系统。Qt 5.9是其一个重要的版本,它在稳定性和性能上都有显著提升,同时也引入...

    QT捕捉Q聊天窗口

    在这个"QT捕捉Qq聊天窗口"的例子中,我们主要关注的是如何利用QT来捕获并处理QQ聊天窗口的内容。 首先,我们需要了解QT中的窗口捕获机制。在QT中,可以使用`QScreen`类来获取系统的屏幕信息,而`QWindow`类则代表了...

    QT实时捕获鼠标及键盘事件

    QT框架是Qt公司开发的一种跨平台应用程序开发框架,广泛用于创建GUI(图形用户界面)程序。在QT中,我们可以利用其丰富的API来实现对鼠标和键盘事件的实时捕获和处理,这对于创建交互性强的应用程序至关重要。下面...

    Qt无边框窗口最大化时拖拽还原代码

    在无边框窗口中,我们可以通过安装事件过滤器来监听鼠标事件,以便在用户尝试拖动窗口时捕捉到这一行为。 以下是实现这一功能的关键步骤: 1. **创建无边框窗口**:首先,你需要创建一个继承自`QMainWindow`或`...

    基于QT开发的一款按键精灵

    在这款基于QT开发的按键精灵中,开发者利用了QT的事件处理机制来捕捉和响应用户的键盘输入。按键精灵的主要功能是模拟用户对键盘的操作,例如自动按下特定的按键序列,这对于游戏自动化、测试脚本编写或任何需要重复...

    QT 键盘监听(重写监听事件)

    总结来说,QT的键盘监听主要依赖于事件过滤器机制,通过创建自定义的事件过滤器类并重写`eventFilter()`方法,我们可以捕捉到所有的键盘事件。这个过程涉及到对象的事件处理机制、事件类型识别以及事件的自定义处理...

    QT开发的截屏软件——全代码

    QT开发的截屏软件是一种利用QT库来实现的桌面应用程序,用于捕捉屏幕图像。QT是一个跨平台的C++图形用户界面应用程序开发框架,由Trolltech(现为Nokia)开发,现在由The Qt Company维护。它允许开发者创建出美观且...

    Qt不规则窗口的定制

    Qt框架因其丰富的功能和灵活性,成为了开发此类窗口的理想选择。本文将深入探讨如何在Qt中创建不规则窗口,包括窗口的定制流程、关键技术和示例代码分析。 #### 一、不规则窗口的基本概念 不规则窗口,顾名思义,...

    Qt界面最小化获取键盘鼠标事件-windows消息-windows_hook

    在开发桌面应用程序时,有时我们需要在程序窗口最小化或者后台运行时仍能捕获用户的键盘和鼠标事件。在Windows平台上,这通常通过利用Windows消息机制和钩子(Hooks)技术来实现。Qt作为一款跨平台的C++图形用户界面...

    Qt EventFilter 事件过滤器 及传递 鼠标键盘事件捕捉

    在Qt框架中,EventFilter是一个强大的机制,它允许我们拦截并处理特定对象接收到的事件。EventFilter可以用于监控和过滤任何QObject子类的对象的事件,包括鼠标和键盘事件。这个功能在创建自定义行为或者跨对象通信...

    Qt全局鼠标、键盘事件监听器库

    在Qt中,通常我们可以通过继承`QWidget`类并重写其`mouseMoveEvent`、`mousePressEvent`、`mouseReleaseEvent`、`keyPressEvent`和`keyReleaseEvent`等方法来处理特定窗口内的鼠标和键盘事件。然而,当需要监听全局...

    Qt实现聊天界面--历史聊天信息源码

    4. **信号与槽(Signals & Slots)**:这是Qt的核心特性之一,用于实现对象间的通信。例如,当用户点击发送按钮时,可以通过信号触发槽函数,将输入框中的文本作为新的聊天消息发送出去,并更新聊天记录显示。 5. *...

    Qt 标尺绘制Demo C++

    5. **事件处理**:捕捉用户的滑动事件,更新标尺的值,并可能触发相应的信号。 在"SliderRuler"这个压缩包文件中,可能包含了实现上述功能的源代码文件,例如头文件(.h)和源文件(.cpp)。开发者可能已经封装了一...

    基于QT的RGB取色器

    此外,为了支持键盘响应,开发者需要使用QT的信号和槽机制,将键盘事件与相应的函数连接起来,确保用户可以通过按键快速执行取色操作。 QT框架还提供了一些高级特性,如国际化(i18n)支持、样式表(QSS)用于界面...

    Qt开发的截图工具.zip

    《Qt开发的截图工具——深度解析与应用》 Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备。它以其丰富的功能、高效性能和易用性受到开发者们的青睐。本文将深入探讨使用Qt开发的一款截图工具...

    Qt加载百度离线地图

    在本文中,我们将深入探讨如何使用Qt 4.8.6框架加载百度离线地图,实现地图功能,包括街道图与卫星图的切换、地图标签的动态移动以及获取地图坐标并显示在Qt界面中。首先,我们需要理解Qt库以及如何在其中集成百度...

    QT-key_linuxQT虚拟小键盘_qt虚拟键盘_

    QT是Qt Company开发的一种跨平台的应用程序开发框架,主要用C++语言编写,适用于Windows、Linux、macOS等多种...它涉及到Qt的GUI设计、事件处理、信号与槽机制以及自定义控件等方面的知识,为用户提供便捷的输入体验。

    osgWidget2.rar_osg Qt_qt osg_qt+OSG_qt结合osg_qt键盘事件

    在Qt中,可以使用安装事件过滤器或者重载键盘事件处理函数(如keyPressEvent()和keyReleaseEvent())来捕捉键盘输入。在结合OSG的情况下,可能需要将这些键盘事件传递给OSG,以便在3D场景中响应用户的按键操作,例如...

    qt做的小程序-鼠标事件

    QT,全称Qt,是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面、移动及嵌入式系统。这个“qt做的小程序-鼠标事件”是一个基础的示例项目,旨在帮助初学者理解如何在QT Creator环境中处理鼠标的各类...

Global site tag (gtag.js) - Google Analytics