C++ 如何将信号和插槽与qt中的另一个对象连接——已解决

C++ 如何将信号和插槽与qt中的另一个对象连接——已解决,c++,qt,C++,Qt,我正在做一个qt项目,我的目标是根据我的输入画一些东西。信号在主体中,图纸在另一个对象中,我无法连接它们 int main(int argc, char *argv[]) { QApplication app(argc, argv); Frequency fre; //this is the class that does the drawing QWidget *window = new QWidget; QGridLayout *grid = new QGri

我正在做一个qt项目,我的目标是根据我的输入画一些东西。信号在主体中,图纸在另一个对象中,我无法连接它们

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Frequency fre; //this is the class that does the drawing
    QWidget *window = new QWidget;
    QGridLayout *grid = new QGridLayout;
    
    QGroupBox *groupBox = new QGroupBox(QObject::tr("Volume"));
    QSpinBox *spinBox = new QSpinBox;
    spinBox->setRange(0, 5);
    QObject::connect(spinBox, SIGNAL(valueChanged(int)),&fre, SLOT(setVolume(int))); 
    QVBoxLayout *Vbox = new QVBoxLayout;
    Vbox->addWidget(spinBox);
    groupBox->setLayout(Vbox);
    grid->addWidget(groupBox, 4,7,1,1);

    window->setLayout(grid);
    window->show();
    return app.exec();
 }
这是我设置频率类的方式:

在h文件中

class Frequency : public QGLWidget
{
    Q_OBJECT

public slots:
        void setVolume(int value);
在cpp文件中

void Frequency :: setVolume(int val) {
    vol = val;
    updateGL(); 
}

void Frequency :: paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    draw();
}

因为我不能把所有这些都放在评论部分,所以我将把它放在这里:

我复制了您的代码,无法使用Qt版本
5.14.0
再现错误,因为当我以任何方式更改值时,将调用方法
void MyObject::setVolume(int value)

这段代码应该适合你。可能是在发布模式下运行它,并使用断点检查是否调用了它(在发布模式下并不总是有效)

/#包括“QtWidgetsApplication4.h”
#包括
#包括“MyObject.h”
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
//QTWidget应用程序4 w;
//w.show();
//返回a.exec();
MyObject对象;
QWidget*窗口=新的QWidget;
QGridLayout*grid=新的QGridLayout;
QGroupBox*groupBox=新的QGroupBox(QObject::tr(“卷”);
QSpinBox*spinBox=新QSpinBox;
spinBox->setRange(0,5);
连接(spinBox,信号(valueChanged(int)),&对象,插槽(setVolume(int));
QVBoxLayout*Vbox=新的QVBoxLayout;
Vbox->addWidget(spinBox);
groupBox->setLayout(Vbox);
grid->addWidget(groupBox,4,7,1,1);
窗口->设置布局(网格);
窗口->显示();
返回a.exec();
}
#pragma一次
#包括
类MyObject:公共QObject
{
Q_对象
公众时段:
void setVolume(int值);
私人:
国际货币单位体积;
};
#包括“MyObject.h”
void MyObject::setVolume(int值)
{
m_体积=值;
}

这看起来是正确的,但您没有显示完整的标题。你忘了Q_对象宏了吗?是的,我忘了,我修改了我的问题来说明这一点。“我无法连接它们”是什么意思?运行程序时是否看到打印到stdout或stderr的错误消息?如果是,它会说什么?您正在使用旧式连接:您是否尝试过
QObject::connect(spinBox,QSpinBox::valueChanged,&fre,&Frequency::setVolume)
?@Ashley如果
connect()
调用没有发出错误消息,则很可能连接设置正确,并且没有发出
valueChanged(int)
信号,或者(更可能)调用
setVolume(int)
方法时没有预期效果。接下来我要做的是在
setVolume(int)
方法中添加一个临时的
printf()
调用,看看它是否真的被调用了。我使用了一个旧版本的qt,但无论如何,解决了这个问题。谢谢。我使用了旧语法,所以您可以运行它;)还有,到底出了什么问题?我的答案不是真正的解决方案,所以不应该标记它,除非解决方案在那里。如果不在里面,你可以提供你自己问题的详细答案,并将其标记为解决方案。不客气!