【问题标题】:Qt connect() usageQt connect() 用法
【发布时间】:2014-11-07 19:17:16
【问题描述】:

我正在浏览 Qt5 的 MediaPlayer 示例,它的一些连接语句相当混乱:

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

看起来像是使用旧 Qt 语法的 connect():

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)), this, SLOT(durationChanged(qint64)));

??

【问题讨论】:

    标签: c++ qt signals-slots


    【解决方案1】:

    不,这是正确的。您可以这样做,因为durationChangedthis 中的一个插槽,因此您可以省略this

    如你所见here

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

    有发送者、信号、槽和类型。文档给出了很好的解释:

    这个函数重载了connect()。连接来自发送方的信号 反对这个对象的方法。相当于connect(sender, signal, this,方法,类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多