我正在查看 Qt5 的 MediaPlayer 示例,它的一些 connect 语句相当令人困惑:
player.h:
class Player : public QWidget
{
Q_OBJECT
public:
Player(QWidget *parent = 0);
~Player();
signals:
void fullScreenChanged(bool fullScreen);
private slots:
void open();
void durationChanged(qint64 duration);
void positionChanged(qint64 progress);
void metaDataChanged();
void previousClicked();
void seek(int seconds);
void jump(const QModelIndex &index);
void playlistPositionChanged(int);
void statusChanged(QMediaPlayer::MediaStatus status);
void bufferingProgress(int progress);
void videoAvailableChanged(bool available);
void displayErrorMessage();
#ifndef PLAYER_NO_COLOROPTIONS
void showColorDialog();
#endif
void addToPlaylist(const QStringList &fileNames);
private:
void setTrackInfo(const QString &info);
void setStatusInfo(const QString &info);
void handleCursor(QMediaPlayer::MediaStatus status);
void updateDurationInfo(qint64 currentInfo);
QMediaPlayer *player;
QMediaPlaylist *playlist;
VideoWidget *videoWidget;
QLabel *coverLabel;
QSlider *slider;
QLabel *labelDuration;
QPushButton *fullScreenButton;
#ifndef PLAYER_NO_COLOROPTIONS
QPushButton *colorButton;
QDialog *colorDialog;
#endif
QLabel *labelHistogram;
HistogramWidget *histogram;
QVideoProbe *probe;
PlaylistModel *playlistModel;
QAbstractItemView *playlistView;
QString trackInfo;
QString statusInfo;
qint64 duration;
};
玩家.cpp:
Player::Player(QWidget *parent)
: QWidget(parent)
, videoWidget(0)
, coverLabel(0)
, slider(0)
#ifndef PLAYER_NO_COLOROPTIONS
, colorDialog(0)
#endif
{
player = new QMediaPlayer(this);
// owned by PlaylistModel
playlist = new QMediaPlaylist();
player->setPlaylist(playlist);
connect(player, SIGNAL(durationChanged(qint64)), SLOT(durationChanged(qint64)));
connect(player, SIGNAL(positionChanged(qint64)), SLOT(positionChanged(qint64)));
connect(player, SIGNAL(metaDataChanged()), SLOT(metaDataChanged()));
connect(playlist, SIGNAL(currentIndexChanged(int)), SLOT(playlistPositionChanged(int)));
connect(player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
this, SLOT(statusChanged(QMediaPlayer::MediaStatus)));
connect(player, SIGNAL(bufferStatusChanged(int)), this, SLOT(bufferingProgress(int)));
connect(player, SIGNAL(videoAvailableChanged(bool)), this, SLOT(videoAvailableChanged(bool)));
connect(player, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(displayErrorMessage()));
...
看起来
connect()
使用旧的 Qt 语法:
connect(sender, SIGNAL(valueChanged(QString,QString)),
receiver, SLOT(updateValue(QString)) );
但是,在player.cpp
connect()
表达式中,只有发送者(玩家),没有接收者。线
connect(player, SIGNAL(durationChanged(qint64)), SLOT(durationChanged(qint64)));
似乎连接了 QMediaPlayer 的
durationChanged() signal to Player's
durationChanged()` 插槽,但不应该是这样吗
connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64)));
??
不,这是正确的。您可以这样做,因为
durationChanged()
是 this
中的一个槽,因此您可以调用 connect()
的 成员函数版本:
QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal,
const char * method,
Qt::ConnectionType type = Qt::AutoConnection) const
有发送者、信号、槽位和类型。文档给出了很好的解释:
此函数重载
。连接来自发送器的信号 反对该对象的方法。相当于
connect()
。
connect(sender, signal, this, method, type)