我试图将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;
}
};
答案 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)));
}