传递自定义类来连接(信号和插槽)

Posted

技术标签:

【中文标题】传递自定义类来连接(信号和插槽)【英文标题】:Passing custom class to connect (signals and slot) 【发布时间】:2016-08-21 18:26:33 【问题描述】:

我正在尝试创建一个带有一些文本输入字段的新对话框。这些文本区域在单击按钮时(作为确认)必须插入到自定义类向量中(通过现有方法)。

我的疑问是,我怎样才能适应连接函数来传递自定义类作为参考?我是这方面的新手,请原谅我的愚蠢。 这是(部分)我的代码。

#include "aggiungi.h"
#include "ui_aggiungi.h"


aggiungi::aggiungi(clienti& c, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::aggiungi)


ui->setupUi(this);

connect(ui->inserisci,SIGNAL(clicked()),this,SLOT(pulsanteInserisci(c)));



aggiungi::~aggiungi()

  delete ui;


void aggiungi::pulsanteInserisci(clienti& c) 

string nome = ui->textNome->toPlainText().toStdString();
unsigned int cc = ui->textCod->toPlainText().toUInt();
string piva = ui->textPIva->toPlainText().toStdString();

cliente* nc = new cliente(nome,cc,piva);
c.aggiungi(*nc);


我想要的是能够传递“clienti”对象,以便在单击按钮时执行命令。该解决方案(显然)不起作用,但我该如何纠正它?你有什么建议?

我还将粘贴我从应用程序输出中得到的错误:

QObject::connect: No such slot aggiungi::pulsanteInserisci(c) 
in..\Progetto2016\git\database\aggiungi.cpp:9
QObject::connect:  (sender name:   'inserisci')
QObject::connect:  (receiver name: 'aggiungi')

提前致谢

【问题讨论】:

您使用的是旧的信号/槽语法。使用the new syntax introduced in Qt5,这里的问题应该就清楚了。 @MrEricSir 由于一些项目限制,我必须使用 Qt creator 4 和旧版本编译器 minGW 4.8.3,我不知道是否已经支持新语法。 【参考方案1】:

您不能将值传递给 SIGNAL()SLOT() 宏。您必须通过签名。此外,信号和时隙必须兼容。换句话说,签名必须匹配。有关详细信息,请参阅documentation。

话虽如此,您无法将按钮的clicked() 信号连接到需要任何参数的插槽。一个简单的解决方案是将clienti存储为成员变量,并使用pulsanteInserisci()中的成员变量。

【讨论】:

【参考方案2】:

连接应该是:

connect(ui->inserisci,SIGNAL(clicked(clienti&)),this,SLOT(pulsanteInserisci(clienti&)));

connect(ui->inserisci,SIGNAL(clicked()),this,SLOT(pulsanteInserisci()));

【讨论】:

但是使用这种方式,我如何设置在点击时传递给函数 pulsanteInserisci() 的内容? 在信号和槽之间建立连接时,参数必须兼容。信号可以有比槽更多的参数,但反过来不行。 所以应该是:connect(ui->inserisci,SIGNAL(clicked(clienti&)),this,SLOT(pulsanteInserisci(clienti&)));或:connect(ui->inserisci,SIGNAL(clicked()),this,SLOT(pulsanteInserisci()));

以上是关于传递自定义类来连接(信号和插槽)的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止信号到达自定义插槽

Qt 将信号与自定义插槽匹配

信号没有被其他类捕获

Qt信号槽如何附带自定义参数

c_cpp 用于调试信号的自定义插槽,验证它们是否被触发

PYQT学习之自定义信号