【发布时间】:2017-08-31 14:34:32
【问题描述】:
背景
我正在用 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: 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();
}
【问题讨论】:
-
似乎在编译时另一行被注释掉了:
//QMediaPlayer * player ; cmediaplayer * player; // My custom type并以大写字母开始类名(编码约定)。 -
@AlexanderVX QMediaPlayer 是原始对象。我用编译好的 cmedia 播放器替换它。我把它留在那里是为了发表评论
-
好吧,它为你编译是令人鼓舞的@eyllanesc 我重新启动了 Qt(再次),现在它在抱怨:在函数 cmediaplayer::cmediaplayer() 中未定义对 cmediaplayer 的 vtable 的引用 collect2:error: ld 返回1 退出状态真的让我很困惑,因为我没有改变任何东西!
-
@eyllanesc drive.google.com/open?id=0B4QUZRlxzP4hUFQ0UkdzWEZCc00 我已经删除了 *.h 和 *.cpp 文件中的一些未使用的东西来整理一下
-
@eyllanesc 我已经删除了构建文件,并重新编译了所有内容,它清除了我遇到的错误。现在似乎可以工作了!
标签: c++ qt qt5 qt-signals qt-slot