首页 文章

在Qt中从qml获取信号到c类

提问于
浏览
1

我试图弄清楚如何从QML代码中获取信号并将其连接到位于C类的插槽中 .

我从这个answer获取代码并且屏幕上显示的控件但是我无法获得信号 .

这是相关代码:

test.qml:

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

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

menu.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:对象的属性'qmlSignal'Switch_QMLTYPE_4(0x291ac70)不是函数

2 回答

  • 2

    简单,将其标记为插槽

    看起来你有一个C对象,你需要调用一个插槽,所以将该函数标记为 slot ,然后它会自动显示 . 在C中不需要奇怪的connect() .

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

    还有其他方法可以做到,但似乎这涵盖了你的情况 . 如果没有,请详细说明,我们将对其进行改进 .

  • 0

    我希望您的示例足够,并且切换项也是根目录 . 这通常解决如下:

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

    Qt article详情 . 此外,您可以在需要时使用限定符 swt ,以便在该文件中的其他上下文中使用 swt.qmlSignal() .

    此外,C部分也需要修复:

    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);
    
       view->setSource(QUrl("qrc:/test.qml")); 
       ui->verticalLayout->addWidget(container);
    
       QObject::connect((QObject*)view->rootObject(), SIGNAL(qmlSignal()),
                         this, SLOT(receiveFromQml()));
    }
    

    我通过查看发出类似信号的自己的代码进行了更改,但实际上没有尝试,但是您需要连接到从QML viewrootObject 而不是它的widget容器中暴露的信号 .

相关问题