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



by 무위자연 2015. 2. 25. 14:20
| 1 |