c++ - 从qml获取信号到Qt中的c++类

标签 c++ qt qml qt-quick

我试图找出如何从 QML 代码获取信号并将其连接到位于 C++ 类中的插槽。

我从这个 answer 中获取代码和屏幕上显示的控件,但我收不到信号。

相关代码如下:

测试.qml:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1

Switch{
    id: swt;
    checked:true;
    onCheckedChanged: swt.qmlSignal();
}

菜单.cpp:

Menu::Menu(QWidget *parent) :
QWidget(parent),
        ui(new Ui::Menu)
{
    ui->setupUi(this);
    QQuickView *view = new QQuickView();
    QWidget *container = QWidget::createWindowContainer(view, this);

    container->setMaximumSize(50, 20);

    QObject::connect(container, SIGNAL(qmlSignal()),
                     this, SLOT(receiveFromQml()));

    view->setSource(QUrl("qrc:/test.qml")); 
    ui->verticalLayout->addWidget(container);



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

我看过示例 here但我无法让它工作。

这是我得到的错误:

qrc:/test.qml:10: TypeError: Property 'qmlSignal' of object Switch_QMLTYPE_4(0x291ac70) is not a function

最佳答案

简单,标记为slot

似乎你有一个 C++ 对象,你需要调用一个插槽,所以将函数标记为 插槽,然后它会自动公开。在 C++ 中不需要奇怪的 connect()。

// Seems Switch is a QML Item
Switch{
 id: swt;
 checked:true;
 onCheckedChanged: myCppObj.slot(); // calls the object's slot 
} 

还有其他方法可以做到这一点,但这似乎涵盖了您的情况。如果没有,请详细说明,我们会对其进行完善。

关于c++ - 从qml获取信号到Qt中的c++类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31728098/

相关文章:

c++ - Qt (C++) : multiple definitions of functions

c++ - 公共(public)和私有(private)领域的内存分配 - GCC方式

c++ - 如何使用 CMake 隐藏头文件以进行单元测试

c++ - 找不到“ui_mainwindow.h”文件

javascript - QML 旋转排列项目

qt - 如何在 ShapePath 中使用 LinearGradient?

qt - 布局 2 block 元素的正确方法

c++ - Excel 文件和 C++

C++ 强制 new[] 不分配 4 个额外的字节

c++ - 在非VS项目中包含VS DLL