Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何从两个不同的cpp更新qml文本?_Qt_Qml_Qt Quick_Qproperty - Fatal编程技术网

Qt 如何从两个不同的cpp更新qml文本?

Qt 如何从两个不同的cpp更新qml文本?,qt,qml,qt-quick,qproperty,Qt,Qml,Qt Quick,Qproperty,我有一个qml项目 StackPage.qml上有一个文本(名为id:cnt),我需要从firstclass.cpp和secondclass.cpp更新此文本 Q_属性定义在firstclass.h上,setCntText函数在firstclass.cpp上 我通过setCntText(I)从firstclass.cpp更新文本,并通过调用setCntText(0)尝试从secondclass.cpp更新文本 我可以从secondclass设置m_cntText变量,但无法更新qml text(

我有一个qml项目

StackPage.qml上有一个文本(名为id:cnt),我需要从firstclass.cpp和secondclass.cpp更新此文本

Q_属性定义在firstclass.h上,setCntText函数在firstclass.cpp上

我通过setCntText(I)从firstclass.cpp更新文本,并通过调用setCntText(0)尝试从secondclass.cpp更新文本

我可以从secondclass设置m_cntText变量,但无法更新qml text(名为id:cnt)

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include "firstclass.h"
#include "secondclass.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    firstClass frmFirstClass;
    engine.rootContext()->setContextProperty("frmFirstClass",&frmFirstClass);

    secondClass frmSecondClass;

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
StackPage.qml

import QtQuick 2.0

Item {

    Rectangle{
        anchors.centerIn: parent
        width: 200
        height: 200
        color: "orange"

        Text {
            id: cnt
            text: frmFirstClass.cntText
            verticalAlignment: Text.AlignVCenter
            horizontalAlignment: Text.AlignHCenter
            font.pointSize: 40
            anchors.fill: parent
        }

    }

}

您的
extern
用法不完整,因此实际上创建了两个
firstClass
实例。由于
extern
在点上有点误导,我建议您在创建
secondClass
(主要)时,给一个指向“一个且唯一的”
firstClass
的指针。这也使代码更好地表示了预期的层次结构

更新以下文件:

二等舱

secondClass.cpp

免责声明:我没有试图编译此文件

#include "secondclass.h"

firstClass frmFirstClass;

secondClass::secondClass(QObject *parent) : QObject(parent)
{
    QTimer *timer = new QTimer();
    timer->setSingleShot(true);
    timer->start(1000);

    connect(timer, &QTimer::timeout, [=]() {
        QTimer *timer2 = new QTimer(this);
        connect(timer2,SIGNAL(timeout()),this,SLOT(setter2()));
        timer2->start(2000);
        timer->deleteLater();
    } );
}

void secondClass::setter2()
{
    frmFirstClass.setCntText(0);
    qDebug() << "Checking m_cntText = " << frmFirstClass.m_cntText;
}
#ifndef FIRSTCLASS_H
#define FIRSTCLASS_H

#include <QObject>
#include <QTimer>
#include <QDebug>

class firstClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int cntText READ cntText WRITE setCntText NOTIFY cntTextChanged)


public:
    explicit firstClass(QObject *parent = nullptr);

    int cntText() const;

    int m_cntText;

signals:

    void cntTextChanged(int cntText);

public slots:

    void setCntText(int cntText);

private slots:

    void setter1();
};

#endif // FIRSTCLASS_H
#ifndef SECONDCLASS_H
#define SECONDCLASS_H

#include <QObject>
#include <QTimer>
#include <QDebug>
#include "firstclass.h"

extern firstClass frmFirstClass;

class secondClass : public QObject
{
    Q_OBJECT

private:

public:
    explicit secondClass(QObject *parent = nullptr);

signals:

public slots:

private slots:

    void setter2();
};

#endif // SECONDCLASS_H
import QtQuick 2.10
import QtQuick.Window 2.12
import QtQuick.Controls 2.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Rectangle{
        anchors.fill: parent
        color: "black"

        StackView{
            anchors.fill: parent
            initialItem : stackPage
        }

        Component{
            id:stackPage
            StackPage{}
        }
    }
}
import QtQuick 2.0

Item {

    Rectangle{
        anchors.centerIn: parent
        width: 200
        height: 200
        color: "orange"

        Text {
            id: cnt
            text: frmFirstClass.cntText
            verticalAlignment: Text.AlignVCenter
            horizontalAlignment: Text.AlignHCenter
            font.pointSize: 40
            anchors.fill: parent
        }

    }

}
#include "firstClass.h"

class secondClass : public QObject
{
    Q_OBJECT

    private:

    public:
        explicit secondClass(firstClass *theFirstClass, QObject *parent = nullptr);

    signals:

    public slots:

    private slots:

        void setter2();

    private:
        firstClass *myFirstClass_ = nullptr;
};
#include "secondclass.h"

secondClass::secondClass(firstClass *theFirstClass, QObject *parent) 
    : QObject(parent)
    , myFirstClass(theFirstClass)
{
    QTimer *timer = new QTimer();
    timer->setSingleShot(true);
    timer->start(1000);

    connect(timer, &QTimer::timeout, [=]() {
        QTimer *timer2 = new QTimer(this);
        connect(timer2,SIGNAL(timeout()),this,SLOT(setter2()));
        timer2->start(2000);
        timer->deleteLater();
    } );
}

void secondClass::setter2()
{
    myFirstClass->setCntText(0);
    qDebug() << "Checking m_cntText = " << myFirstClass->m_cntText;
}
int main(int argc, char *argv[])
{
    ...

    firstClass frmFirstClass;
    engine.rootContext()->setContextProperty("frmFirstClass", &frmFirstClass);

    secondClass frmSecondClass(&frmFirstClass);

    ...
}