无法将QML组合框信号连接到C ++插槽

时间:2014-08-19 07:53:16

标签: c++ qt combobox

我试图将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
    }
}

comboboxsignalreceiver.h

#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;
    }
};

2 个答案:

答案 0 :(得分:1)

objectName应该是一个字符串。在你的情况下。 QML正在搜索标识为combo的对象,但未找到一个(因此出现错误消息)

 objectName: "combo"

应解决您的问题。

请参阅QObject::objectName属性以供参考

答案 1 :(得分:1)

您无法将ComboBox转换为QComboBox,因为它实例化了QQuickItem而不是QComboBox。 findChild方法的工作原理是通过objectName查找child,它需要是字符串。所以 combo 应该是一个字符串&#34; combo&#34;。 此外,对于ComboBox元素,没有currentIndexChanged信号(至少我没有看到),您可以使用激活信号,如下所示:

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