Qt自定义SLOT子类未被CONNECT识别

问题描述 投票:1回答:2

背景

我正在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:23中没有这样的插槽QMediaPlayer :: set_playback_position(int)

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();
}
c++ qt qt5 qt-signals qt-slot
2个回答
1
投票

Qt创建了一个新类,它实现了插槽和信号之间的实际连接,但很多时候这个没有更新。它们引用的类具有类似于moc_xxx.cpp的名称,并且这些类在build文件夹中创建。

要强制它们更新,我们必须单击位于QtCreator的Menu Build中的make clean子菜单,然后在同一菜单中运行qmake。

或者,您可以手动删除构建文件夹并将其编译回来


1
投票

也许,它可以帮助某人。尝试在connect调用中使用SLOT函数时,我遇到了类似的问题。即使插槽是在子类中声明和定义的,connect函数也不会识别它,发出一条消息,说明插槽函数不是基类的一部分。

在我的情况下,问题是我没有将Q_OBJECT放在类声明的开头。之后,我不得不清理(否则,在编译步骤中会出现各种错误)并再次构建项目以使插槽功能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.