Использование Qt connect ()

0

Я просматриваю пример Qt5 MediaPlayer, и некоторые из его операторов соединения довольно запутывают:

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

Похоже, что 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" к слоту "durationChanged" проигрывателя, но это не должно быть

connect (player, SIGNAL (durationChanged (qint64)), это, SLOT (durationChanged (qint64)));

??

Теги:
qt
signals-slots

1 ответ

2
Лучший ответ

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню