类型注册后如何在QML信号处理程序中捕获C ++信号?

贾廷

我正在开发一个基本的qml-cpp应用程序,以了解一个人如何与另一个人交互。我有一个MessageSetter C ++类和一个main.qml。由于我希望了解双向通信,因此我使用setContextProperty将MessageSetter属性公开给qml,并且还向qml注册了MessageSetter类(实例注册)。暴露的属性工作正常。现在,单击qml按钮后,信号(qmlBtnClicked)已成功捕获到MessageSetter插槽(onQmlButtonClicked)中。此插槽进一步发出另一个MessageSetter信号(colorChanged)。这个新的(C ++)信号应该被qml注册的MessageSetter的信号处理程序(onColorChanged)捕获,但是无论如何都不会到达这里。下面是main.cpp代码:

int main(int argc, char *argv[])
{
   QGuiApplication app(argc, argv);
   QQmlApplicationEngine engine;
   qmlRegisterType<MessageSetter>("com.SkillLotto.MessageSetter", 1, 0, "SetMessage");

   MessageSetter data;
   engine.rootContext()->setContextProperty("msgSetter", &data);
   QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));

   QObject *object = component.create()->findChild<QObject*>("setTextBtn");
   QObject::connect(object, SIGNAL(qmlBtnClicked()), &data, SLOT(onQmlButtonClicked()));

   return app.exec();
}

这是MessageSetter插槽,它发出另一个信号:

void MessageSetter::onQmlButtonClicked()
{
   emit colorChanged("red");
}

这是qml代码,永远不会调用此信号处理程序:

SetMessage{
    onColorChanged: {
        rect.color = color    //rect is some rectangle in this file.
    }
}

如我所述,qml信号已成功捕获到C ++插槽中,但是我无法在qml信号处理程序中捕获此C ++信号。请帮忙。

正如我所看到的,这个问题主要集中在qmlRegisterType()上,并且不应该与这个问题重复吗?我还想知道qmlRegisterType()和setContextProperty()是否可以同时使用?

塔罗德

我认为您的代码应该运行良好。

我没有完整的代码,所以我不知道您是否实现了正确的方法。

为了获得使用信号,qmlRegisterType您需要一些要求。检查您是否Q_PROPERTY实现宏调用。任何可写属性都应具有关联的NOTIFY信号,只要该属性值已更改,该信号便会发出。

如果是这样,则在更改组件中color属性时SetMessageonColorChanged应触发信号

在这里,您有一个示例,其中发出了两个信号:第一个信号是在更新size属性时,第二个信号是在使用CmouseClick调用C ++方法时MouseArea

顺便说一句,您不需要setContextProperty将C ++类与QML集成在一起。qmlRegisterType应该足够了。反之亦然,取决于您的需求。您可以同时使用两者,但是随后将有两个不同的对象可以使用。这实际上取决于您要实现的目标。

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "customitem.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    qmlRegisterType<CustomItem>("CustomItem", 1,0, "CustomItem");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

customitem.h

#ifndef CUSTOMITEM_H
#define CUSTOMITEM_H

#include <QObject>

class CustomItem: public QObject
{
    Q_OBJECT

    /*
     * Any property that is writable should have an associated NOTIFY signal.
     * Ref: http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html#exposing-properties
     */

    Q_PROPERTY(int size READ size WRITE setSize NOTIFY sizeChanged)

public:
    CustomItem(QObject *parent = 0);

    int size() const;
    void setSize(int);

    Q_INVOKABLE void mouseClick();

private:
    int m_size;

signals:
    void sizeChanged(int size);
    void clicked();

public slots:
};

#endif // CUSTOMITEM_H

customitem.cpp

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

CustomItem::CustomItem(QObject *parent)
: QObject(parent), m_size(0)
{
}

int CustomItem::size() const
{
    return m_size;
}

void CustomItem::setSize(int size)
{
    m_size = size;
    emit sizeChanged(m_size);
}

void CustomItem::mouseClick()
{
    qDebug() << "CustomItem::mouseClick()";

    emit clicked();
}

main.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import CustomItem 1.0

Window {
    visible: true

    TextInput  {
        id: mySize
        x: 0
        y: 0
        text: "100"
    }

    CustomItem {
        id: customItem
        size: mySize.text

        onSizeChanged: console.log("size changed:", size)
        onClicked: console.log("onClicked!")
    }

    Rectangle {
        id: rect
        x: 50
        y: 50
        width: customItem.size
        height: customItem.size
        color: "red"

        MouseArea {
            anchors.fill: parent
            onClicked: { customItem.mouseClick() }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类型注册后如何在QML信号处理程序中捕获C ++信号?

来自分类Dev

信号与信号

来自分类Dev

信号与信号

来自分类Dev

QML信号处理程序不响应C ++信号

来自分类Dev

为C中的任何信号设置信号处理程序

来自分类Dev

为C中的任何信号设置信号处理程序

来自分类Dev

如何在Rust中捕获信号

来自分类Dev

如何在Julia中捕获Linux信号

来自分类Dev

主信号,文本信号

来自分类Dev

信号的信号?活性可可

来自分类Dev

从默认致命信号的信号处理程序返回

来自分类Dev

如何在elisp中创建信号处理程序?

来自分类Dev

如何在子进程中更改信号处理程序?

来自分类Dev

如何在elisp中创建信号处理程序?

来自分类Dev

Django:如何在信号处理程序中获取域名

来自分类Dev

如何在python中处理不同的信号

来自分类Dev

C:信号处理和信号量

来自分类Dev

Perl中的信号处理

来自分类Dev

Linux中的信号处理

来自分类Dev

在 ncurses 中处理信号

来自分类Dev

信号处理C编程

来自分类Dev

如何将信号处理程序注册为类方法?

来自分类Dev

如何为子流程注册信号处理程序?

来自分类Dev

QML - 如何将操作附加到信号处理程序?

来自分类Dev

如何从异步处理程序的信号处理程序中捕获自定义异常?

来自分类Dev

timer_create()无法在处理程序函数中捕获信号

来自分类Dev

如何设置qml信号的属性类型?

来自分类Dev

如何设置qml信号的属性类型?

来自分类Dev

标记信号