如何将信号和插槽与 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)