QT对窗口关闭事件处理, QMainWindow 窗口与 QDialog 使用不同方式重载函数, 各类重载函数分别为:

QMainWindow

#include <QCloseEvent>
void MainWindow::closeEvent (QCloseEvent *event)
    QMessageBox::StandardButton resBtn = QMessageBox::question( this, APP_NAME,
                                                                tr("Are you sure?\n"),
                                                                QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                                                QMessageBox::Yes);
    if (resBtn != QMessageBox::Yes) {
        event->ignore();
    } else {
        event->accept();

QDialog

void MyDialog::reject()
    QMessageBox::StandardButton resBtn = QMessageBox::Yes;
    if (changes) {
        resBtn = QMessageBox::question( this, APP_NAME,
                                        tr("Are you sure?\n"),
                                        QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                        QMessageBox::Yes);
    if (resBtn == QMessageBox::Yes) {
        QDialog::reject();

参考文章:How do I handle the event of the user pressing the ‘X’ (close) button?

Linux下面QT写Can通信程序,网络上有很多例子都是互相抄的;本人因为项目原因,通过源代码Socket函数,写了完整的程序,含有2个案例;分享给大家; 这里主要是包含几个步骤,1:绑定Socket;2:cna/can1的设置,3:波特率的设置(如果发送和接收波特率不一致肯定不行的);4:发送;5:接收处理; 下面就贴出部分代码: void MyWindow::startcan(int number) int ret = 0; //can先关闭 设置好波特率后 再开启can if(number == 0) //can0 system("ifconfig can0 down");//先关闭 system("ip link set can0 up type can bitrate 50000 triple-sampling on");//设置波特率 system("ifconfig can0 up");//再开启 else //can1 system("ifconfig can1 down");//先关闭 system("ip link set can1 up type can bitrate 50000 triple-sampling on");//设置波特率 system("ifconfig can1 up");//再开启 socket = ::socket(PF_CAN,SOCK_RAW,CAN_RAW); struct ifreq ifr; strcpy((char *)(ifr.ifr_name),number == 0 ? "can0" : "can1"); ioctl(socket,SIOCGIFINDEX,&ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; ret = bind(socket,(struct sockaddr*)&addr,sizeof(addr)); if (ret OpenCan(50000); ArmCan = new Thread(zyhapi,socket,port); ArmCan->start(); struct can_frame frame; memset(&frame,0,sizeof(struct can_frame)); std::string str=ui->edit->text().toStdString(); if(str.length() > 8) QMessageBox::about(this,"error","length of send string must less than 8 bytes"); return; struct can_frame frame; memset(&frame,0,sizeof(struct can_frame)); char buf[8]={0X20,0XFF,0X01,0X02,0X03,0X04,0XFF,0XFF}; frame.can_id = 0x00000020;//发出去的帧ID即:0X00000020 frame.can_dlc = 8;//帧数据长度 for(int i=0;i<frame.can_dlc;i++) frame.data[i]=buf[i];//帧数据 //frame.can_id = 0x123; //strcpy((char*)frame.data,str.c_str()); //frame.can_dlc = str.length(); sendto(socket,&frame,sizeof(struct can_frame),0,(struct sockaddr*)&addr,sizeof(addr)); struct can_frame frame; char buf[8]={0X20,0XFF,0X01,0X02,0X03,0X04,0XFF,0XFF}; frame.can_id = 0x00000020;//发出去的帧ID即:0X00000020 frame.can_dlc = 8;//帧数据长度 for(int i=0;iWriteCan(frame.can_id,frame.data,frame.can_dlc);//发数据,通过can端口-- 暂时默认 CAN0 端口 Qt/C++中使用OCX控件的调用方法及事件处理 代码实例简单的调用了OCX提供的函数,和OCX事件处理(采用了信号与槽的方式),调用qt的方法获取列出所有ocx控件的所有信号、函数、属性等。 谢谢大家的分享和分数,我很需要它们。 提示:这里可以添加本文要记录的大概内容: 目前控制台发现关闭控制台窗口后,无法进入析构函数,因为按照网上说法,a.exec和程序是分开的,你关闭控制台窗口,只是退出exec,但是并没有结束程序,所以不会进程序析构;但是参考win32控制台程序退出案列,发现通过捕捉信号,可以实现资源回收。 提示:以下是本篇文章正文内容,下面案例可供参考 一、原理和环境 因为关闭控制台程. 废话不多说,最近想写一个控制台程序,希望在执行完正常的代码后自动退出程序,研究了很久很久,看了很多办法,都不得行,最后可行的办法记录于此,避免以后再次入坑。 首先,Qt 程序正常退出的方式有如下几种: 1、手动点击关闭按钮;(不适用于自动关闭程序) 2、通过系统pid杀死程序;(这个怕是给自己挖坑啊) 3、调用程序自带的 exit() 退出程序函数; 3、调用程序自带的 quit() 退出... 许多人创建qt控制台程序会遇到这种情况,关闭控制台的时候,自己写的子线程无法正常退出,无法进入自己创建的对象的析构函数,总之程序非正常退出. 为解决这种问题我想了几种思路,实践证明最后一种思路可以达到要求,没有耐心的可以直接看最后一项解决方案: 1.通过QTextStream监听用户输入, 当用户有输入则退出程序. QCoreApplication a MyClass c; QString str; QTextStream in(stdin);//获取数据 in>>str; QTim main.cpp: Exit_Thread *mythread=new Exit_Thread(); QObject::connect(mythread,SIGNAL(finished()),&a,SLOT(quit())); mythread->start(); exitthread.h: #ifndef EXITTHREAD_H #define EXITTHREAD_H #include <QObject> #include <QTh * The library is needed by function SendMessageA() * This code is sometimes necessary, sometimes not #pragma comment(lib, "User32.lib") #include "widget.h" #include <QApplication> #include 在 Qt 中,事件是从抽象QEvent类派生的对象,它们表示在应用程序内发生的事情或作为应用程序需要了解的外部活动的结果。 事件可以由QObject子类的任何实例接收和处理 如何传递事件 当一个事件发生时,Qt 通过构造一个合适的QEvent子类的实例来创建一个事件对象表示它,并通过调用它的event()函数将它传递给QObject 的一个特定实例(或其子类)。 大多数事件类型都有特殊的类,例如: QResizeEvent :包含调整大小事件的事件参数 QPaintEvent :包含绘