C++ 如何从cpp文件发出信号并在QML文件中接收?

C++ 如何从cpp文件发出信号并在QML文件中接收?,c++,qt,qml,signals,C++,Qt,Qml,Signals,当party->startParty()时,我想从ClearPin类发送clearPinChanged(const QString&pin)信号;调用。现在它对我不起作用了。我可以在不改变代码结构的情况下发送信号吗 下面的代码是我刚刚添加ClearPin类的Qt示例之一 通常,我如何向非主要组件(如example.qml组件中创建的clearpin.qml)发送信号 生日聚会 #ifndef BIRTHDAYPARTY_H #define BIRTHDAYPARTY_H #include &l

当party->startParty()时,我想从ClearPin类发送clearPinChanged(const QString&pin)信号;调用。现在它对我不起作用了。我可以在不改变代码结构的情况下发送信号吗

下面的代码是我刚刚添加ClearPin类的Qt示例之一

通常,我如何向非主要组件(如example.qml组件中创建的clearpin.qml)发送信号

生日聚会

#ifndef BIRTHDAYPARTY_H
#define BIRTHDAYPARTY_H

#include <QObject>
#include <QDate>
#include <qqml.h>
#include "person.h"
#include "Clearpin.h"

class BirthdayPartyAttached : public QObject
{
Q_OBJECT
Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp)
public:
BirthdayPartyAttached(QObject *object);

QDate rsvp() const;
void setRsvp(const QDate &);

private:
QDate m_rsvp;
};

class BirthdayParty : public QObject
{
Q_OBJECT
Q_PROPERTY(Person *host READ host WRITE setHost)
Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
Q_CLASSINFO("DefaultProperty", "guests")
public:
BirthdayParty(QObject *parent = 0);

Person *host() const;
void setHost(Person *);

QQmlListProperty<Person> guests();
int guestCount() const;
Person *guest(int) const;

static BirthdayPartyAttached *qmlAttachedProperties(QObject *);

void startParty();
signals:
void partyStarted(const QTime &ttime);

private:
Person *m_host;
QList<Person *> m_guests;

ClearPin clearpin;
};
QML_DECLARE_TYPEINFO(BirthdayParty, QML_HAS_ATTACHED_PROPERTIES)

#endif // BIRTHDAYPARTY_H
clearpin.qml

import QtQuick 2.0
import ClearPin 1.0

Item {

ClearPin{
 onClearPinChanged: {
     console.log("pinnnn:",pin)
}
}

}

问题是BirthdayParty类从它的ClearPin实例发出信号,但是在QML代码中,您创建了ClearPin的第二个实例并监听它的信号

从你对ClearPin的定义来看,我不清楚它的目的是什么。看起来这只是一个QString。如果您只需要这些,那么您可以将字符串作为BirthdayParty类的属性,如下所示:

class BirthdayParty : public QObject
{
Q_OBJECT
Q_PROPERTY(QString clearPin READ clearPin WRITE setClearPin NOTIFY clearPinChanged)

public:
    ...

    QString clearPin();
    void setClearPin(QString pin)

signals:
    void clearPinChanged();
}
在QML中,您应该能够监听其信号:

BirthdayParty {
    onClearPinChanged: {
        console.log("clearPin: " + clearPin);
    }
}

问题是BirthdayParty类从它的ClearPin实例发出信号,但是在QML代码中,您创建了ClearPin的第二个实例并监听它的信号

从你对ClearPin的定义来看,我不清楚它的目的是什么。看起来这只是一个QString。如果您只需要这些,那么您可以将字符串作为BirthdayParty类的属性,如下所示:

class BirthdayParty : public QObject
{
Q_OBJECT
Q_PROPERTY(QString clearPin READ clearPin WRITE setClearPin NOTIFY clearPinChanged)

public:
    ...

    QString clearPin();
    void setClearPin(QString pin)

signals:
    void clearPinChanged();
}
在QML中,您应该能够监听其信号:

BirthdayParty {
    onClearPinChanged: {
        console.log("clearPin: " + clearPin);
    }
}

接得好!没有a就不那么明显了(感谢scopchanov的建议。谢谢JarMan,但我无法更改代码的结构。我只需要从ClearPin类而不是从BirthdayParty发送信号。@mohamadrezamoosavi然后确保在发出信号的ClearPin的同一个实例上侦听信号,而不是创建第二个实例。捕捉得好!不是这是显而易见的(感谢scopchanov的建议。谢谢JarMan,但我无法更改代码的结构。我只需要从ClearPin类发送信号,而不是从BirthdayParty发送信号。@mohamadrezamoosavi然后确保在发出信号的ClearPin的同一实例上侦听信号,而不是创建第二个实例。请获取f请为将来提供一个。
import QtQuick 2.0
import ClearPin 1.0

Item {

ClearPin{
 onClearPinChanged: {
     console.log("pinnnn:",pin)
}
}

}
class BirthdayParty : public QObject
{
Q_OBJECT
Q_PROPERTY(QString clearPin READ clearPin WRITE setClearPin NOTIFY clearPinChanged)

public:
    ...

    QString clearPin();
    void setClearPin(QString pin)

signals:
    void clearPinChanged();
}
BirthdayParty {
    onClearPinChanged: {
        console.log("clearPin: " + clearPin);
    }
}