簡體   English   中英

無法將QML組合框信號連接到C ++插槽

[英]Can't connect QML combobox signal to C++ slot

我正在嘗試將QML組合框的currentIndexChanged信號連接到我的類的插槽。 問題是,rootObject-> findChild始終返回NULL,就好像該特定組合框不存在一樣。

我收到這些錯誤:

qrc:main.qml:134: ReferenceError: combo is not defined
QObject::connect: Cannot connect (null)::currentIndexChanged(int) to ComboBoxSignalReceiver::cppSlot(int)

,盡管我為組合框定義了objectName。


main.cpp

#include <QQuickView>
#include <QQmlContext>
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QListView>
#include <QtQuick>
#include <QComboBox>
#include <comboboxsignalreceiver.h>

int main(int argc, char *argv[])
{


    QStringList event_types;
    event_types.append("concerts");
    event_types.append("exhibitions");

    QApplication app(argc, argv);
    QQuickView view;
    view.setSource(QUrl("qrc:main.qml"));
    view.setResizeMode(QQuickView::SizeRootObjectToView);

    QQmlContext *context = view.rootContext();
    QObject* rootObject = view.rootObject();

    context->setContextProperty("comboBoxModel", QVariant::fromValue(event_types));

    QComboBox* combo = rootObject->findChild<QComboBox*>("combo");
    ComboBoxSignalReceiver comboBoxSignalReceiver;

    QObject::connect(combo, SIGNAL(currentIndexChanged(int)),
            &comboBoxSignalReceiver, SLOT(cppSlot(int)));

    view.show();

    return app.exec();

}

main.qml

import QtQuick 2.0
import QtQuick.Controls 1.1
import QtQuick.Dialogs 1.2
import QtQuick.Window 2.0

Rectangle {
    width: 510
    height: 400
    clip: true

ComboBox {
        id: comboBox1
        objectName: combo
        model: comboBoxModel
        currentIndex: 0
        x: 418
        y: 8
        width: 84
        height: 20
        activeFocusOnPress: true
    }
}

組合框信號接收器

#include <QObject>
#include <iostream>

class ComboBoxSignalReceiver : public QObject
{
    Q_OBJECT
public slots:
    void cppSlot(const int &v) {
       std::cout << "Called the C++ slot with value:" << v;
    }
};

objectName應該是一個字符串。 就你而言。 QML正在使用標識符combo搜索對象,但未找到對象(因此出現錯誤消息)

 objectName: "combo"

應該解決您的問題。

請參閱QObject :: objectName屬性以供參考

您不能將ComboBox強制轉換為QComboBox,因為它會實例化QQuickItem而不是QComboBox。 findChild方法通過按objectName查找必需的子項來工作,該objectName必須是字符串 因此, combo應該是“ combo”的字符串。 此外,對於ComboBox元素,沒有currentIndexChanged信號(至少我沒有看到),您可以使用激活的信號,如下所示:

QQuickItem *item = view.rootObject()->findChild<QQuickItem*>("combo");
if(item) {
    QObject::connect(item,SIGNAL(activated(int)),&comboBoxSignalReceiver,SLOT(cppSlot(int)));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM