为什么ClassA
中的slot sl_classASaveDataFromClassB
没有被调用?我从另一个类(ClassB
)向slot发出一个信号,并期望在调用ClassB::closeEvent
函数时调用sl_classASaveDataFromClassB
函数。
事件流程如下:
1.程序启动时,调用ClassA构造函数,建立信号/插槽连接:connect(ClassB::getInstance(), SIGNAL(&ClassB::sig_ClassBData(float,float)), this, SLOT(sl_classASaveDataFromClassB(float,float)));
,其中我将B类的信号连接到A类的SLOT函数。
1.用户看到一个通用配置屏幕。2这个屏幕的代码包含一个带有配置变量的结构。
1.用户点击一个按钮,启动一个窗口,在该窗口中输入与两个浮点值(blahA
和blahB
)相关的两个浮点值。
1.用户选择调用ClassB::on_btnDataSave_clicked()
的“保存”图标
1.这将调用发出信号sig_classBData
的QT函数ClassB::closeEvent(QCloseEvent *event)
在代码中放置断点表明在窗口关闭时调用了overidden ClassB::closeEvent
,并发出了信号,但从未调用slot函数。
ClassA.c
ClassA_UI::ClassA_UI(QWidget *parent, c_Instrument *Instrument) :
QFrame(parent),
ui(new Ui::ClassA_UI)
{
connect(ClassB::getInstance(), SIGNAL(&ClassB::sig_ClassBData(float,float)), this, SLOT(&sl_classASaveDataFromClassB(float,float)));
}
void ClassA_UI::on_btnClick_setVals()
{
ClassB::getInstance()->show();
}
void ClassA_UI sl_classASaveDataFromClassB(float latitude, float longitude)
{
qDebug() << "test";
}
ClassA.h
class ClassA_UI : public QFrame
{
Q_OBJECT
public:
explicit ClassA_UI(QWidget *parent = 0);
~ClassA_UI();
public slots:
sl_classASaveDataFromClassB(float blahA, float blahB)
}
ClassB* ClassB::getInstance()
{
if(instance == nullptr){
instance = new ClassB();
}
return instance;
}
ClassB.c
ClassB* ClassB::instance = nullptr;
ClassB::ClassB(QWidget *parent) :
QWidget(parent),
ui(new Ui::ClassB)
{
ui->setupUi(this);
data = new data;
connect(this, SIGNAL(sig_ClassBUpdateBox(QString, QString)), this, SLOT(sl_GeoLocationUpdateBox(QString,QString)),Qt::QueuedConnection);
}
void ClassB::on_btnDataSave_clicked()
{
// save long lat values here
location->blahA = ui->lineEdit_blahA->text().toFloat();
location->blahB = ui->lineEdit_blahB->text().toFloat();
// Values set successfully
emit sig_ClassBUpdateBox( "Location Updated", "Location update applied.");
this->close();
}
void ClassB::closeEvent(QCloseEvent *event)
{
qDebug() << "closeEvent" ;
emit sig_classBData(data->blahA, data->blahB);
event->accept();
}
ClassB.h
namespace Ui {
class ClassB;
}
class ClassB : public QWidget
{
Q_OBJECT
public:
explicit ClassB(QWidget *parent = nullptr);
~ClassB();
private:
Ui::ClassB *ui;
private:
typedef struct {
float blahA;
float blahB;
} data;
data *location;
static ClassB* instance;
public:
static ClassB* getInstance();
signals:
void sig_ClassBUpdateBox(QString Title, QString Message);
void sig_classBData(float blahA, float blahB);
};
1条答案
按热度按时间zxlwwiss1#
我通过将连接字符串修改为以下内容解决了这个问题:
我会把我的发现分享给任何遇到类似问题的人。
所以
connect
函数实际上为连接返回了一个布尔值true
/false
,在构造函数中我添加了一个临时布尔变量,我在这个变量上放置了一个断点,它显示连接返回了false
,这告诉我classA
中的槽没有被调用的原因是因为连接从未成功建立。在文档中,连接字符串如下所示:
分解一下: