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

Posted

技术标签:

【中文标题】如何将信号和插槽与 qt 中的另一个对象连接 - 已解决【英文标题】:How to connect signal and slot with another object in qt --solved 【发布时间】:2020-06-28 01:02:17 【问题描述】:

我正在做一个 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();

【问题讨论】:

这看起来正确,但您没有显示完整的标题。您忘记了 Q_OBJECT 宏吗? 是的,我做到了,我修改了我的问题以表明这一点。 “我无法连接它们”是什么意思?运行程序时,您是否看到打印到 stdout 或 stderr 的错误消息?如果有,它说明了什么? 您使用的是旧式连接:您尝试过QObject::connect(spinBox, QSpinBox::valueChanged,&fre, &Frequency::setVolume);吗? @Ashley 如果connect() 调用没有发出错误消息,那么很可能连接设置正确,并且valueChanged(int) 信号没有发出,或者(更多可能)setVolume(int) 方法在被调用时没有达到预期的效果。接下来我要做的是在setVolume(int) 方法中添加一个临时的printf() 调用,看看它是否真的被调用了。 【参考方案1】:

由于无法在评论区全部放出,我就放在这里:

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

此代码应该适合您。可能,您在发布模式下运行它,并使用断点检查它是否被调用(这并不总是在发布模式下工作)。

// #include "QtWidgetsApplication4.h"
#include <QtWidgets/QApplication>
#include "MyObject.h"

#include <QGridLayout>
#include <QGroupBox>
#include <QSpinBox>

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    // QtWidgetsApplication4 w;
    // w.show();
    // return a.exec();

    MyObject object;
    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)), &object, 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 a.exec();

#pragma once
#include <QObject>

class MyObject : public QObject

    Q_OBJECT

public slots:
    void setVolume(int value);

private:
    int m_volume;
;
#include "MyObject.h"

void MyObject::setVolume(int value)

    m_volume = value;

【讨论】:

我用的是老版本的qt,不过不管怎样,问题解决了。谢谢。 我使用了旧语法,所以你可以运行它;)另外,到底出了什么问题?我的答案并不是真正的解决方案,因此不应标记它,除非解决方案在那里。如果它不在那里,您可以为您自己的问题提供详细的答案并将其标记为解决方案。不客气!

以上是关于如何将信号和插槽与 qt 中的另一个对象连接 - 已解决的主要内容,如果未能解决你的问题,请参考以下文章

Qt 4.8:来自不同线程的两个信号和一个插槽之间的连接行为

将 Worker Thread 信号与 MainWindow 插槽连接时出错(Qt5)

Qt 拾遗 003 disconnect

Qt 插槽同时断开连接并从不同线程调用

Qt / Windows:在全局范围对象的构造函数中连接信号和插槽时崩溃

Qt:如何将不同类的静态信号连接到插槽?