欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > QT中,main中事件循环中出了{}范围对象也会析构的问题

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

2025/3/12 1:40:08 来源:https://blog.csdn.net/Alon1787/article/details/146154478  浏览:    关键词:QT中,main中事件循环中出了{}范围对象也会析构的问题

前言

        首先来看一个问题:如下代码,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"

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词