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

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

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

具体的打印title那些就懒得写了,直接这样简单一点。
或许有的人会怀疑,是不是因为 mediaplayer = new QMediaPlayer(0); 而不是this;其实与此无关,正常的写法应该是在析构函数里面写释放mediaplayer的内存。
实际原因是,在C++中,大括号的意思就是限制作用域的。甚至去掉if,只有{},效果也是一样:

导致出了大括号,直接就触发了VideoPlayer的析构函数,导致内部信号关联都释放了。
测试代码
cpp
#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"