我正在Qt写一个媒体播放器应用程序。我已经将QMediaPlayer子类化并创建了一个新的SLOT,它能够解释int并将其作为qint64传递给QMediaPlayer :: SetPosition(qint64)。
QMediaPlayer :: PositionChanged向cslider slider_playback(水平滑块子类)发出信号。这使得滑块在播放歌曲时移动。还有一些子标签(clabel)接收有关歌曲持续时间和歌曲播放位置的信号。
当我构建&运行,我收到以下错误:
开始/ home / daniel / DeveloperProjects / build-Player-Desktop_Qt_5_9_1_GCC_64bit-Debug / Player ...
QObject :: connect:.. / Player / mainwindow.cpp中没有这样的插槽QMediaPlayer :: set_playback_position(int):23
QObject :: connect :(发件人姓名:' slider_playback')
滑块应该能够控制播放的位置。令人讨厌的代码行前面是“玩家寻求”。在文件中发表评论。
我认为错误表明正在为SLOT引用基类,而插槽实际上是派生类的一部分。
为什么会出现此错误以及解决此问题的操作?我的clabel和cslider类中的插槽没有问题。不同之处在于这些类具有构造函数和析构函数。我没有在QMediaPlayer子类中实现构造函数,因为我不想覆盖基类构造函数。
#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
#include "cmediaplayer.h"
void cmediaplayer::set_playback_position(int v) {
this->setPosition( (qint64)v );
}
#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();
};
#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 :(得分:1)
Qt创建了一个新类,它实现了插槽和信号之间的实际连接,但很多时候这个没有更新。他们引用的类的名称类似于 moc_xxx.cpp ,这些类在build文件夹中创建。
要强制他们更新,我们必须点击位于QtCreator菜单构建中的 make clean 子菜单,然后在同一菜单中运行qmake 。 / p>
或者您可以手动删除构建文件夹并将其编译回来
答案 1 :(得分:1)
也许,它可以帮助某人。尝试在connect调用中使用SLOT函数时,我遇到了类似的问题。即使在子类中声明并定义了插槽,连接函数也无法识别该插槽,并发出一条消息,指出插槽函数不属于基类。
就我而言,问题是我没有将Q_OBJECT
放在类声明的开头。之后,我必须清理(否则,编译步骤中会发生各种错误),然后再次构建项目以使插槽功能正常工作。