close函数 qt_QT中的close、closeEvent和析构函数的理解(基础知识)

析构函数

析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

摘自百度文库

void QWidget::closeEvent(QCloseEvent *event)

当Qt从窗口系统接收到窗口关闭请求时,将使用给定的事件调用此事件处理程序。

默认情况下,接受事件并关闭小部件。您可以重新实现此函数来更改小部件响应窗口关闭请求的方式。例如,可以通过对所有事件调用ignore()来防止窗口关闭。

主窗口应用程序通常使用此函数的重新实现来检查用户的工作是否已保存,并在关闭之前请求权限。例如,应用程序示例使用帮助函数来确定是否关闭窗口。

void MainWindow::closeEvent(QCloseEvent *event)

{

if (maybeSave()) {

writeSettings();

event->accept();

} else {

event->ignore();

}

}

** 注: 只是关闭窗口 **

bool QWidget::close()

关闭这个小部件。如果小部件关闭,则返回true;否则返回false。

首先,它向小部件发送一个QCloseEvent。如果小部件接受关闭事件,它将被隐藏。如果它忽略事件,什么也不会发生。QWidget::closeEvent()的默认实现接受关闭事件。

如果小部件有Qt::WA_DeleteOnClose标记,小部件也会被删除。不管小部件是否可见,关闭事件都会传递到小部件。

当最后一个可见主窗口(即没有父窗口的窗口)的Qt::WA_QuitOnClose属性设置关闭时,发出QApplication::lastWindowClosed()信号。默认情况下,此属性为所有窗口小部件设置,除了临时窗口,如启动屏幕、工具窗口和弹出菜单

窗口关闭时谁先调用已经很明了

代码

QWMainWindow::~QWMainWindow() {

qDebug() << "QWMainWindow::~QWMainWindow()";

delete ui;

}

void QWMainWindow::closeEvent(QCloseEvent *event) {

qDebug() << "mainWindow close event " << event->type();

}

消息打印

f4db65a02d4fe9924a0639af752d683a.png

关闭子窗口

playBack = new PlayBackForm();

在closeEvent函数中关闭playBack子窗口,

delete playBack;///>如果子窗口playBack中重载了CloseEvent,函数实现为this.hide();用这个

//playBack.close;///>未在重载函数中使用this.hide()

编码注意

如果你已经在closeevent中delete过就别再析构函数中再次delete了。

点赞

收藏

分享

文章举报

f0d4c93b1ba568493cdefa6fe27bb8b1

de638df49f1d5a3342eecff86bcb011e.png

MMTS_yang

发布了49 篇原创文章 · 获赞 1 · 访问量 2150

私信

关注

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LoRa是一种低功耗、长距离无线通信技术,可以用于物联网设备之间的通信。Qt是一个跨平台的应用程序框架,可以用于开发图形界面、网络编程等应用。 要实现LoRa和Qt的信号传输,首先需要选择一个合适的LoRa模块,如SX1278或SX1276。然后,根据模块的接口进行连接,通常使用SPI或UART接口。接着,在Qt编写代码,使用串口通信或网络编程实现与LoRa模块的通信。 以下是一个简单的示例代码,使用串口通信实现Qt与LoRa模块之间的数据传输: ```C++ #include <QCoreApplication> #include <QSerialPort> #include <QSerialPortInfo> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 查找可用串口 QList<QSerialPortInfo> portList = QSerialPortInfo::availablePorts(); if (portList.isEmpty()) { qDebug() << "没有可用串口"; return a.exec(); } // 打开串口 QSerialPort serialPort; serialPort.setPortName(portList.first().portName()); serialPort.setBaudRate(QSerialPort::Baud9600); serialPort.setDataBits(QSerialPort::Data8); serialPort.setParity(QSerialPort::NoParity); serialPort.setStopBits(QSerialPort::OneStop); if (!serialPort.open(QIODevice::ReadWrite)) { qDebug() << "无法打开串口"; return a.exec(); } // 发送数据 QByteArray sendData = "Hello, LoRa!"; qint64 bytesWritten = serialPort.write(sendData); if (bytesWritten == -1) { qDebug() << "发送数据失败"; serialPort.close(); return a.exec(); } // 接收数据 QByteArray recvData = serialPort.readAll(); if (recvData.isEmpty()) { qDebug() << "没有接收到数据"; serialPort.close(); return a.exec(); } qDebug() << "接收到数据:" << recvData; // 关闭串口 serialPort.close(); return a.exec(); } ``` 需要注意的是,LoRa模块的使用方法和通信协议可能因不同的硬件厂商而异,需要参考相应的文档进行配置和使用。此外,LoRa技术的信号传输距离和可靠性也会受到环境、天气等因素的影响,需要进行充分的测试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值