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