c++ - 在窗口中使用 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 语句中收到一个错误,说它无法转换所有参数类型。我如何修复这些连接语句以使其工作,或者有更好的方法来做到这一点?
解决方案
根据您的代码,QObject::connect(music_slider, SIGNAL(valueChanged(int)), this, SLOT(VolumeChange(int)));
第二个窗口中的此连接无效,因为它没有SLOT
被调用的VolumeChange
. 事实上,它是一个SIGNAL
. 但是,它有一个SLOT
叫changeVolume
,我认为您的意思是。
推荐阅读
- python - 给定一条几何车道,我如何告诉汽车遵循的路径?
- maven - 多 Maven 项目:第一个和最后一个模块在安装时显示版本
- java - 使用java检测表单中的边界框
- c# - C#:在 Linux 上的 .NET Core 中引用或使用 .so 文件
- javascript - 访问另一个数组中的数组以使用 v-for
- php - 如何在数据表子行中显示具有相应id的辅助记录?
- jquery - 为什么我的第二个下拉菜单是复制我的第一个下拉菜单的更改操作
- php - 如果我通过一个表单上传文本文件,是否可以在显示数据库中特定条目记录的其他表单上读取它?
- angular - 如何根据地图框中的值填充区域的颜色?
- botframework - 如何安装 Microsoft BotFramework-Emulator?