QT中,main中事件循环中出了{}范围对象也会析构的问题

server/2025/3/13 17:53:09/

前言

        首先来看一个问题:如下代码,player的位置放在if的括号里面,是否有什么问题? 

分析 

      其实很多人不经意会这么写,但是结果是不会正常执行,引发的问题是,执行完openFile()函数以后,直接就触发VideoPlayer的析构函数了,导致里面关联的信号触发,根本不会执行。

而正常的情况应该是如下的:

具体的打印title那些就懒得写了,直接这样简单一点。

或许有的人会怀疑,是不是因为 mediaplayer = new QMediaPlayer(0); 而不是this;其实与此无关,正常的写法应该是在析构函数里面写释放mediaplayer的内存。

实际原因是,在C++中,大括号的意思就是限制作用域的。甚至去掉if,只有{},效果也是一样:

导致出了大括号,直接就触发了VideoPlayer的析构函数,导致内部信号关联都释放了。

测试代码

#include <QApplication>
#include <QMediaPlayer>
#include <QString>
#include <QDebug>
#include <QUrl>class VideoPlayer : public QObject
{Q_OBJECT
public:VideoPlayer(QObject *parent = 0){mediaplayer = new QMediaPlayer(0);connect(mediaplayer,SIGNAL(metaDataChanged()),this,SLOT(handleMetadata()));}~VideoPlayer(){qDebug()<<"~VideoPlayer()";}QString path = "/home/Videos/test.mp4";
public slots:void handleMetadata(){qDebug()<<"handleMetadata***";}void openFile(){mediaplayer->setMedia(QUrl::fromLocalFile(path));}
private:QMediaPlayer *mediaplayer;};int main(int argc, char *argv[])
{QApplication a(argc, argv);//VideoPlayer player;       // 正常执行handleMetadata()if(1){VideoPlayer player;     // 会导致执行 ~VideoPlayer() 析构player.path = "/home/Videos/1080.mp4";player.openFile();}return a.exec();
}
#include "main.moc"


http://www.ppmy.cn/server/174681.html

相关文章

AP AR

混淆矩阵 真实值正例真实值负例预测值正例TPFP预测值负例FNTN &#xff08;根据阈值预测&#xff09; P精确度计算&#xff1a;TP/(TPFP) R召回率计算&#xff1a;TP/(TPFN) AP 综合考虑P R 根据不同的阈值计算出不同的PR组合&#xff0c; 画出PR曲线&#xff0c;计算曲线…

海康机器人搞工业机器人,我以为它忘记自己名字,作为技术,作为业务你跟不跟,机器视觉工程师搞视觉引导必须知道工业机器人四大坐标系

工业机器人的坐标系是编程、调试和操作的核心基础,不同坐标系决定了机器人的运动方式和参考基准。以下是工业机器人四大坐标系的详细解析,包括定义、功能、应用场景及注意事项: 关节坐标系(Joint Coordinates) 定义 以机器人各关节轴为独立运动单元,每个关节的旋转或直线…

读书笔记 - Spring Boot实战

读书笔记 - Spring Boot实战 第1章 入门Spring Boot精要1. 自动配置2. 起步依赖3. 命令行界面4. Actuator 使用Spring Initializr初始化Spring Boot项目 第2章 运用SpringBootSpringBootApplication配置应用程序属性指定基于功能的依赖覆盖起步依赖引入的传递依赖使用自动配置 …

项目上传到Gitee过程

在gitee上新建一个仓库 点击“克隆/下载”获取仓库地址 电脑上要装好git 在电脑本地文件夹右键“Git Bash Here” 依次执行如下命令 git init git remote add origin https://gitee.com/qlexcel/stm32-simple.git git pull origin master git add . git commit -m ‘init’…

DeepSeek与剪映短视频创作指南

DeepSeek&#xff08;深度求索&#xff09;作为一家专注实现AGI的中国公司&#xff0c;其技术可能涉及AI文本生成、图像处理等领域&#xff0c;结合剪映的智能剪辑功能&#xff0c;可以大幅提升短视频创作效率。以下是结合两者优势的详细创作步骤&#xff1a; 一、创意策划阶段…

严格把控K8S集群中的操作权限,为普通用户生成特定的kubeconfig文件

文章目录 前言一、背景二、证书和证书签名请求(了解)1.证书签名请求2.请求签名流程3.Kubernetes 签名者4.证书过期时间限制字段 二、脚本示例2.检查集群上下文及csr3.切换集群上下文,检查权限4.普通用户操作 总结 前言 使用并维护过K8S的ops/sre都知道,kubeconfig对于k8s的访问…

【CXX】6.2 str — rust::Str

Rust::Str 公共 API // rust/cxx.hclass Str final { public:Str() noexcept;Str(const Str &) noexcept;Str(const String &) noexcept;// 如果输入不是 UTF-8&#xff0c;抛出 std::invalid_argument 异常。Str(const std::string &);Str(const char *);Str(con…

线性表相关代码(顺序表+单链表)

线性表相关代码 线性表相关代码&#xff08;算法命题重点&#xff09;顺序存储链式存储单链表带头结点不带头结点 双链表循环链表静态链表 线性表相关代码&#xff08;算法命题重点&#xff09; 线性表作为一种基础且重要的数据结构&#xff0c;在算法领域中占据着关键地位&am…