首页 > 解决方案 > 在窗口中使用 QSlider 更改背景音量

问题描述

我有一个 MainWindow,然后是一个 SecondWindow 类,当在 MainWindow 中单击一个按钮时它会打开。这个 SecondWindow 类中有一个滑块,我想控制 MainWindow 和 SecondWindow 类中的音乐。

我的主要功能:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.show();

    SecondWindow s;

    //this connects MainWindow to SecondWindow to open
    QObject::connect(...);

    //plays background music
    Music m;
    QObject::connect(&s, SIGNAL(Volume(int)), &m, SLOT(setVol(int)));


    return a.exec();
}

我有一个音乐对象,它播放一个定义如下的函数:

class Music
{
public:
    Music();

public slots:
    void setVol(int value);
private:
    QMediaPlayer* music;
};

我的 SecondWindow 是这样定义的:

class SecondWindow: public QMainWindow
{
    Q_OBJECT
public:
    explicit SecondWindo(QWidget *parent = nullptr);
    ~SecondWindow();
signals:
    void VolumeChange(int value);
    void Volume(int value);

public slots:
    void ShowSettingsWindow();
    void changeVolume(int value);

private:
    void Connections();

    int volume; //holds the volume value based on the music_slider
    QSlider* music_slider;


};

在我的 SecondWindow 的默认构造函数的底部,我有以下连接语句,带有 SLOT 定义:

QObject::connect(music_slider, SIGNAL(valueChanged(int)), this, SLOT(VolumeChange(int)));

void SecondWindow::VolumeChange(int value){
    emit Volume(value);
}

那么音乐的 SLOT 定义如下:

void Music::setVol(int value){
    music->setVolume(value);
}

我目前正在尝试这样做,以便每次滑块更改值时,都会为滑块当前具有的值调用 VolumeChange。然后,调用信号 Volume 导致音乐调用函数 setVol 从而设置音量。但是我在 main 中的第二个 connect 语句中收到一个错误,说它无法转换所有参数类型。我如何修复这些连接语句以使其工作,或者有更好的方法来做到这一点?

标签: c++qtqt5

解决方案


根据您的代码,QObject::connect(music_slider, SIGNAL(valueChanged(int)), this, SLOT(VolumeChange(int)));第二个窗口中的此连接无效,因为它没有SLOT被调用的VolumeChange. 事实上,它是一个SIGNAL. 但是,它有一个SLOTchangeVolume,我认为您的意思是。


推荐阅读