2014-11-07 3 views
0

я прохожу например MediaPlayer Qt5, и некоторые из его утверждений Connect довольно запутанные:Qt подключение() использование

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; 
}; 

player.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())); 
    ... 

похоже подключения(), используя старый Qt синтаксис:

connect(sender, SIGNAL(valueChanged(QString,QString)), 
     receiver, SLOT(updateValue(QString))); 

Однако в выражениях player.cpp connect() есть только отправитель (плеер) и нет получателя. Линия

connect(player, SIGNAL(durationChanged(qint64)), SLOT(durationChanged(qint64))); 

кажется соединить сигнал QMediaPlayer в "durationChanged" в слот игрока "durationChanged", но не следует, что быть

подключения (игрок, SIGNAL (durationChanged (qint64)), это, SLOT (durationChanged (qint64)));

??

ответ

2

Нет, это правильно. Вы можете сделать это, потому что durationChanged слот в this, так что вы можете опустить this:

Как вы можете видеть here

QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection) const 

Есть датчик, сигнал, слот и тип. Документация дает хорошее объяснение:

Эта функция перегружает connect(). Подключает сигнал от отправителя объект к методу этого объекта. Эквивалент подключения (отправитель, сигнал, это, метод, тип).

Смежные вопросы