我有一堂课(例如“控制器”) 在这个课程中,我创建了许多其他课程的对象 与不同的父母。
如何在该类与“控制器”之间发送信号以调用“控制器”类中的函数?
#include "controller.h"
Controller::Controller(QObject *parent) : QObject (parent){
connect(sender(), SIGNAL(recivedCall(QString)), this, SLOT(alert(QString)));
}
void Controller::onCall(QJsonObject callinfo){
nodes[callinfo["username"].toString()]= new PanelManager();
nodes[callinfo["username"].toString()]->handleCallStateChanged(callinfo);
}
void Controller::alert(QString callinfo){
qDebug()<<callinfo;
}
例如,如何从每个“ PanelManager”对象中的“ recivedCall”发送信号以调用“ controller”类中的“ alert”功能?
答案 0 :(得分:1)
创建两个组件的对象必须设置信号和插槽之间的连接。但是,您不应该公开内部组件(即创建getter以返回属性的指针)。
解决Qt最后一个问题的方法是在您的父母中创建一个信号,并让其广播呼叫。 例如,如果需要在两个不同的小部件中将QCheckBox连接到QLineEdit:
class Parent1: public QWidget
{
Q_OBJECT
public:
Parent1(): QWidget(), myCheckBox(new QCheckBox("Edit", this))
{
connect(myCheckBox, &QCheckBox::clicked, this, &Parent1::editForbidden);
}
private:
QCheckBox* myCheckBox;
signals:
void editForbidden(bool);
};
class Parent2: public QWidget
{
Q_OBJECT
public:
Parent2(): QWidget(), myLineEdit(new QLineEdit("Edit", this))
{
connect(this, &Parent2::forbidEdit, myLineEdit, &QLineEdit::setReadOnly);
}
private:
QLineEdit* myLineEdit;
signals:
void forbidEdit(bool);
};
// In the parent of Parent1 and Parent2 (or in the main if there is no parent)
QObject::connect(p1, &Parent1::editForbidden, p2, &Parent2::forbidEdit);
在此示例中,当我单击parent1
中的复选框时,parent2
中的lineEdit被禁用。但是,Parent1对Parent2一无所知。