[英]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.