我有一个包含以下内容的QML文件:
Text {
id: testData
onTaskClicked:{
testData.text = task.name
}
}
问题在于 taskClicked 信号。它是由另一个小部件(C++)发出的,需要转发到 QML。
这类似于这个 SO 问题,但是那里发布的解决方案不起作用(原因在下面说明)。
C++ 代码:
ctxt->setContextProperty(QLatin1Literal("holiday"), m_model);
ctxt->setContextProperty(QLatin1Literal("bgcolor"), color);
view->setResizeMode(QQuickView::SizeRootObjectToView);
auto mainPath = QStandardPaths::locate(QStandardPaths::DataLocation,
QLatin1Literal("taskview.qml"));
view->setSource(QUrl::fromLocalFile(mainPath));
ctxt->setContextProperty(QLatin1Literal("viewer"), m_view);
m_view
是一个QListView
的子类,它会发出taskClicked(HolidayTask* task)
信号(来自.h文件):
m_view
是一个QListView
的子类,它会发出taskClicked(HolidayTask* task)
信号(来自.h文件):
Q_SIGNALS:
void taskClicked(HolidayTask* task);
color
和m_model
已在QML中注册并用于其他地方。信号中的对象已在QML中注册。view
是我的QQuickView
。
首先,我尝试了上述问题中提出的解决方案:
auto root = view->rootObject();
auto myElement = root->findChild<QObject*>(QLatin1Literal("testData");
connect(m_view, SIGNAL(taskClicked(HolidayTask* task), myElement,
SLOT(taskClicked(HolidayTask* task);
然而,myElement
总是 null(我会收到一个有关不存在插槽的运行时警告)。
如果我尝试将视图(即 QListView)指针设置为 QML 视图的上下文属性,它仍然无法工作。
在所有情况下,我还会收到:
QML Connections: Cannot assign to non-existent property "onTaskClicked"
我在这里可能做错了什么?
编辑以澄清一些细节:HolidayTask是一个自定义的QObject子类,信号taskClicked在C ++中定义(在QListView子类中)
编辑2:我们接近了,但还没有成功:
auto root = quickView->rootObject();
auto myElement = root->findChild<QObject*>(QLatin1Literal("testData"));
connect(m_view, SIGNAL(taskClicked(HolidayTask*)),
myElement, SIGNAL(taskClicked(HolidayTask* task)));
和
Text {
id: testData
objectName: "testData"
signal taskClicked(HolidayTask task)
onTaskClicked: {
testData.text = task.name
console.log("CLICk!")
}
}
产生。QObject::connect: No such signal QQuickText_QML_0::taskClicked(HolidayTask* task) in /home/lb/Coding/cpp/holiday-planner/src/mainwindow.cpp:178
QObject::connect: (receiver name: 'testData')
更多细节:HolidayTask,我的自定义 QObject 子类,在代码中注册为
qmlRegisterType<HolidayTask>("HolidayPlanner", 1, 0, "HolidayTask");
仅包含数据的最小QML:
import QtQuick 2.0
import QtQml 2.2
import HolidayPlanner 1.0
Rectangle {
id: container
objectName: "container"
color: bgcolor
Text {
id: testData
objectName: "testData"
signal taskClicked(HolidayTask task)
onTaskClicked: {
testData.text = task.name
console.log("CLICK")
}
}
}
编辑3:最终、可行的代码是(参见答案为什么)
connect(m_view, SIGNAL(taskClicked(HolidayPlanner::HolidayTask*)),
myElement, SIGNAL(taskClicked(HolidayPlanner::HolidayTask*)));
只有通过使用具有完整命名空间的对象才能使其正常工作,否则在QML中签名将无法匹配。