Пользовательский слот Qt подкласса не распознается CONNECT

Фон

Я пишу приложение для медиаплеера в Qt. Я создал подкласс QMediaPlayer и создал новый слот, который способен интерпретировать int и передавать его как qint64 в QMediaPlayer :: SetPosition (qint64).

QMediaPlayer :: PositionChanged запускает сигнал для cslider slider_playback (подкласс горизонтального слайдера). Это заставляет слайдер двигаться во время воспроизведения песни. Есть также несколько подклассных меток (метка), которые принимают сигналы, касающиеся длительности песни и позиции воспроизведения песни.

проблема

Проблема у меня возникает при сборке & запустить, я получаю следующую ошибку:

Начиная / home / daniel / DeveloperProjects / build-Player-Desktop_Qt_5_9_1_GCC_64bit-Debug / Player …

QObject :: connect: такого слота нет QMediaPlayer :: set_playback_position (int) в ../Player/mainwindow.cpp:23

QObject :: connect: (имя отправителя: ‘slider_playback’)

Слайдер должен иметь возможность контролировать положение воспроизведения. Перед ошибочной строкой кода в файле добавляется комментарий «// Player search».

Я думаю, что ошибка указывает, что базовый класс упоминается для 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();
}

0

Решение

Qt создает новый класс, который реализует фактическое соединение между слотами и сигналами, но много раз этот класс не обновляется. Классы, на которые они ссылаются, имеют имя, подобное moc_xxx.cpp и они создаются в папке сборки.

Чтобы заставить их обновить, мы должны нажать на очистить подменю, которое находится в Меню сборки QtCreator, а затем запустить qmake в том же меню.

Или вы можете вручную удалить папку сборки и скомпилировать ее обратно

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]