QObject connect() 如何在没有“接收者”参数的情况下工作?

问题描述 投票:0回答:1

我正在查看 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)));

??

c++ qt signals-slots
1个回答
3
投票

不,这是正确的。您可以这样做,因为

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)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.