1

バックグラウンド

Qt でメディア プレーヤー アプリケーションを作成しています。QMediaPlayer をサブクラス化し、int を解釈して qint64 として QMediaPlayer::SetPosition(qint64) に渡すことができる新しい SLOT を作成しました。

QMediaPlayer::PositionChanged は cslider slider_playback (水平スライダのサブクラス) に信号を送信します。これにより、曲の再生に合わせてスライダーが動きます。曲の長さと曲の再生位置に関する信号を受信する、サブクラス化されたラベル (clabel) もあります。

問題

ビルドして実行すると問題が発生し、次のエラーが表示されます。

/home/daniel/DeveloperProjects/build-Player-Desktop_Qt_5_9_1_GCC_64bit-Debug/Player を起動しています...

QObject::connect: No such slot QMediaPlayer::set_playback_position(int) in ../Player/mainwindow.cpp:23

QObject::connect: (送信者名: 'slider_playback')

スライダーは、再生の位置を制御できる必要があります。問題のあるコード行の前に、ファイル内の '// Player seek' コメントがあります。

このエラーは、スロットが実際には派生クラスの一部であるのに対し、基本クラスが SLOT に対して参照されていることを示していると思います。

このエラーが発生する理由と、問題を解決するアクションを教えてください。私の clabel および cslider クラスのスロットは問題なく動作します。違いは、これらのクラスにはコンストラクタとデストラクタがあることです。基本クラスのコンストラクターをオーバーライドしたくないため、QMediaPlayer サブクラスにコンストラクターを実装していません。

cmediaplayer.h (完全なファイル)

#ifndef CMEDIAPLAYER_H
#define CMEDIAPLAYER_H

#include <QMediaPlayer>
//#include <QObject>

class cmediaplayer : public QMediaPlayer
{
    Q_OBJECT

public slots:
    void set_playback_position(int);
};

#endif // CMEDIAPLAYER_H

cmediaplayer.cpp (完全なファイル)

#include "cmediaplayer.h"

void cmediaplayer::set_playback_position(int v) {
    this->setPosition( (qint64)v );
}

mainwindow.h (完全なファイル)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include "cmediaplayer.h"
#include "clabel.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QPalette m_pal;
    QString media_file_str="/usr/share/example-content/Ubuntu_Free_Culture_Showcase/Jenyfa Duncan - Australia.ogg";
    //QMediaPlayer * player ;
    cmediaplayer * player; // My custom type

private slots:
    void on_pushButton_pressed();
    void on_pushButton_released();
    void on_button_playback_clicked();
};

mainwindow.cpp (完全なファイル)

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow) {
    ui->setupUi(this);

    //player = new QMediaPlayer;
    player = new cmediaplayer; // My custom type

    // set max time on playback slider
    connect(player, SIGNAL(durationChanged(qint64)), ui->slider_playback, SLOT(set_qint64_max(qint64)));

    // st max time on playback label
    connect(player, SIGNAL(durationChanged(qint64)), ui->label_track_length, SLOT(setIntText(qint64)));

    // set slider playback position
    connect(player, SIGNAL(positionChanged(qint64)), ui->label_track_position, SLOT(setIntText(qint64)));


    // Player seek
    connect(ui->slider_playback,
        SIGNAL(valueChanged(int)),
        player,
        SLOT(set_playback_position(int)));


    // Player volume
    connect(ui->slider_volume,SIGNAL(valueChanged(int)),player,SLOT(setVolume(int)));
    ui->slider_volume->setValue(50); // set player initial value
}

MainWindow::~MainWindow() {
    delete ui;
    delete player;
    //delete playlist;
}

void MainWindow::on_pushButton_pressed() {
    m_pal=this->palette().color(QPalette::Background);
    QPalette pal=palette();
    pal.setColor(QPalette::Background,Qt::gray);
    this->setAutoFillBackground(true);
    this->setPalette(pal);

    player->setMedia(QUrl::fromLocalFile(media_file_str));
    player->setPlaybackRate(1);
    player->play();
}

void MainWindow::on_pushButton_released() {
    QPalette pal=m_pal;
    this->setAutoFillBackground(true);
    this->setPalette(pal);
    //player->stop();
}

void MainWindow::on_button_playback_clicked()
{
    //player->play();
}
4

2 に答える 2