繁体   English   中英

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

[英]how to emit signal from cpp file and receive it in QML file?

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

下面的代码是 Qt 示例之一,我刚刚在其中添加了 ClearPin class。

通常如何将信号发送到非主要组件,例如在 example.qml 组件中创建的 clearpin.qml?

生日派对.h

#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

生日派对.cpp

#include "birthdayparty.h"

BirthdayPartyAttached::BirthdayPartyAttached(QObject *object)
: QObject(object)
{
}

QDate BirthdayPartyAttached::rsvp() const
{
return m_rsvp;
}

void BirthdayPartyAttached::setRsvp(const QDate &d)
{
m_rsvp = d;
}


BirthdayParty::BirthdayParty(QObject *parent)
: QObject(parent), m_host(nullptr)
{
}

Person *BirthdayParty::host() const
{
return m_host;
}

void BirthdayParty::setHost(Person *c)
{
m_host = c;
}

QQmlListProperty<Person> BirthdayParty::guests()
{
return QQmlListProperty<Person>(this, m_guests);
}

int BirthdayParty::guestCount() const
{
return m_guests.count();
}

Person *BirthdayParty::guest(int index) const
{
return m_guests.at(index);
}

void BirthdayParty::startParty()
{
QTime ttime = QTime::currentTime();
clearpin.setClearPin("4");
emit partyStarted(ttime);//it works
}

BirthdayPartyAttached *BirthdayParty::qmlAttachedProperties(QObject *object)
{
return new BirthdayPartyAttached(object);
}

Clearpin.h

#ifndef CLEARPIN_H
#define CLEARPIN_H

#include <QObject>

class ClearPin : public QObject
{
Q_OBJECT
//     Q_PROPERTY(QString clearPin READ clearPin WRITE setClearPin)
public:
explicit ClearPin(QObject *parent = nullptr);
virtual ~ClearPin();

 QString clearPin() const;
 void setClearPin(const QString & pin);
 void removeClearPing(int n);
 void removeAll();
private:
 QString m_clearPin;

signals:
void clearPinChanged(const QString& pin);

};

#endif // CLEARPIN_H

Clearpin.cpp

#include "Clearpin.h"
#include <QDebug>


ClearPin::ClearPin(QObject *parent) : QObject(parent)
{
m_clearPin="";
}

ClearPin::~ClearPin()
{

}

QString ClearPin::clearPin() const
{
return m_clearPin;
}

void ClearPin::setClearPin(const QString &pin)
{
qDebug()<<"setClearPin:"<<pin.toStdString().c_str();
m_clearPin=pin;
emit clearPinChanged(m_clearPin); //it does not work  ???????????
}

void ClearPin::removeClearPing(int n)
{
m_clearPin.chop(n);
}

void ClearPin::removeAll()
{
m_clearPin.clear();
}

主文件

#include <QCoreApplication>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QDebug>
#include "birthdayparty.h"
#include "person.h"
#include "Clearpin.h"

int main(int argc, char ** argv)
{
QCoreApplication app(argc, argv);

qmlRegisterType<BirthdayPartyAttached>();
qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty");
qmlRegisterType<ClearPin>("ClearPin", 1,0, "ClearPin");


QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml"));
BirthdayParty *party = qobject_cast<BirthdayParty *>(component.create());

party->startParty();
return 0;
}

例子.qml

import People 1.0
import QtQuick 2.0  // For QColor

BirthdayParty {

property var component
property var object

onPartyStarted:{
    console.log("This party started rockin' at " + ttime);
    component= Qt.createComponent("clearpin.qml");
    object=component.createObject(rootRectId);
}
}

clearpin.qml

import QtQuick 2.0
import ClearPin 1.0

Item {

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

}

问题是你的生日派对 class 从它的 ClearPin 实例发出信号,但是在你的 QML 代码中,你创建了 ClearPin 的第二个实例并监听它的信号。

从您对 ClearPin 的定义来看,我不清楚它的目的是什么。 看起来它只是一个QString。 如果这就是您所需要的,那么您可以将字符串设置为生日派对 class 的属性,如下所示:

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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM