QObject를 상속 받은 클래스면 구현이 가능하다.
원하는 동작을 정의하고 해당 동작이 SIGNAL로써 call이 되며
해당 함수는 인자를 가질수 있고 그 인자가 SLOT의 input argument가 된다.
이때 주의할 것은 int 같은 기본 형은 그대로 인자로 사용할수 있으나 QJsonObject 와 같은 형태는 레퍼런스(reference)로 넘겨야 한다 그렇지 않을 경우에 하기와 같은 애러가 발생하는데 그 내용이 이것임을 알기가 어렵다.
"invalid use of incomplete type 'class QJsonObject...@ moc_.....cpp
(전체 애러 상황은 첨부파일을 참고 부탁드립니다)
SIGNAL 시그널 은 "emit" 함수를 통해서 발생시킨다.
이벤트 발생 예.
emit executeCmd(&jsonObject);
헤더 파일 예.
class SLObject : public QObject
{
Q_OBJECT
public:
explicit SLObject(QObject *parent = 0);
~SLObject();
void sendCmd(QString cmdStr);
signals:
void executeCmd(QJsonObject* jobj);
상기와 같이 정의된 클래스를 쓸때는 다음과 같이 사용한다.,
SLObject *temp = new SLObject(); // 클래스 객체 생성
connect(temp, SIGNAL(executeCmd(QJsonObject*)),this, SLOT(on_test_getuserinfo(QJsonObject*))); // 정의한 시그널을 원하는 슬롯에 connect 한다.
실제 슬롯에서는...
이때 시그널에서 emit한 인자가 슬롯의 input으로 들오옴을 화인할 수 있다.
void UserInformation::on_test_getuserinfo(QJsonObject* json)
{
// QJsonObject jsonObject = *json;
ui->userNameEdit->setText((*json)[QString::number(0)].toObject()["user_name"].toString());
19.5.22 추가
QObject를 상속만 받고 class 정의에 "Q_OBJECT"를 추가하지 않으면 다음과 같은 에러가 난다. moc_ 파일 빌드 문제도 아니고 원인을 알기가 어렵다.
에러 Unresolved external symbol on signals
RECENT COMMENT