簡體   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