【问题标题】:Fail To Connect Qml signal to C++ Slot无法将 Qml 信号连接到 C++ 插槽
【发布时间】:2018-06-07 01:54:53
【问题描述】:

我一直在尝试在 Qml 文件和 c++ 之间连接信号,但 c++ 中的公共插槽似乎没有接收到信号。 我的程序可能有什么问题?

ma​​in.qml

Item{
    id:item
    signal qml_signal
    Button{
        onClicked: {
            item.qml_signal();
        }
    }
}

ma​​in.cpp

QQuickView view(QUrl("qrc:/main.qml"));
QObject *item = view.rootObject();
Myclass myclass;
QObject::connect(item, SIGNAL(qml_signal()), &myclass,SLOT(cppSlot()));

myclass.h

void cppSlot() ;

myclass.cpp

void Myclass::cppSlot(){
    qDebug() << "Called the C++ slot with message:";
}

【问题讨论】:

标签: c++ qt qml qt5


【解决方案1】:

当您希望对象在 C++ 和 QML 之间进行交互时,您必须在 QML 端进行,因为从 C++ 获取 QML 对象可能会给您带来很多问题,因为在这种情况下,在 QML 中创建的信号无法处理在 C++ 中。

解决方案是将您的对象myclass 导出到 QML 并在那里建立连接:

ma​​in.cpp

#include "myclass.h"

#include <QGuiApplication>
#include <QQuickView>
#include <QQmlContext>

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

    QGuiApplication app(argc, argv);

    QQuickView view(QUrl("qrc:/main.qml"));
    Myclass myclass;
    view.rootContext()->setContextProperty("myclass", &myclass);

    view.show();
    return app.exec();
}

ma​​in.qml

import QtQuick 2.9
import QtQuick.Controls 1.4

Item{
    id:item
    signal qml_signal
    Button{
        onClicked: item.qml_signal()
    }
    onQml_signal: myclass.cppSlot()
}

【讨论】:

  • @eyllanesc:虽然我支持你的意见,但关于应该在哪里建立连接 - 对我来说,当你在 C++ 端建立它时它工作正常。我猜在 OP 的不完整、不可验证的示例中还有另一个错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多