【发布时间】:2020-03-29 11:41:42
【问题描述】:
你能想出第二种情况不起作用的原因吗?
我在两个窗口有信号连接,Settings 和 Patients
在Settings:
Settings::Settings( QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Settings)
{
ui->setupUi(this);
connect(&api, &tetra_grip_api::tetraGripEvent,this, &Settings::eventHandler);
...
}
api 是一个类的全局实例。
在Patients:
Patients::Patients( QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Patients)
{
ui->setupUi(this);
connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);
}
情况 1 - 工作
我从Main 构造Settings 和Patients 窗口
#include <QApplication>
tetra_grip_api api;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
api.openSerialPort();
QObject::connect(api.serial, SIGNAL(readyRead()), &api, SLOT(readData()));
Settings w(nullptr); //---->this behaves right
Patients v(nullptr); //---- >this behaves right
v.show();
w.show();
return a.exec();
}
我的意思是,两个插槽都被调用,QLabel 相应地设置文本
情况 2 - 不工作
我从Settings 拨打Patients:
void Settings::on_pushButton_patients_clicked()
{
this->close();
stagetwo = new Patients(this);
stagetwo -> show();
}
stagetwo 是公开的
public:
Settings(QString,QWidget *parent = nullptr);
~Settings();
Patients *stagetwo;
这里Settings 工作正常(插槽被调用)但Patients::eventhandlerTwo 根本没有被调用。
编辑(发现错误)
了解我需要在 API (battery_percentage) 中调用一个方法来发出信号 tetraGripEvent 为时已晚(bettery_percentage 将联系设备中的“电池寄存器”,这将强制 API 发出信号)
基本上我需要在Settings 和Patients 上都这样做
#include "settings.h"
#include "ui_settings.h"
Settings :: Settings (QWidget *parent) : QMainWindow(parent)
QMainWindow(parent)
, ui(new Ui::Settings )
{
ui->setupUi(this);
connect(&api, &tetra_grip_api::tetraGripEvent,this, &Settings::eventHandler);
...
tetra_grip_api::battery_percentage(); ------> calling this only emit the signal
}
在Patients
#include "patients.h"
#include "ui_patients.h"
Patients::Patients(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Patients)
{
ui->setupUi(this);
connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);
...
tetra_grip_api::battery_percentage();
}
【问题讨论】:
-
您的
Settings类型是否设置了Qt::WA_DeleteOnClose属性? -
看这里:github.com/bialasjaroslaw/event_handlers 如果您单击按钮并打开第二个窗口,则会处理两个事件,因为创建了患者类的对象。如果您没有在 5 秒内单击(事件是 QTimer 的超时),则不会创建患者对象,尽管从未连接到事件信号。基本上没有病人类的对象连接到 QTimer::timeout,所以除了 Settings::eventHandler 之外什么都没有被触发。在您的第一个示例中,两个对象都是在开始时创建的,因此从一开始就是连接的。