我有TabbedPane
个标签。第一个有ListView
,当选择列表视图中的元素时,它会打开组成视图的消息。
TabbedPane {
attachedObjects: [
ComponentDefinition {
id: cmp_page
// ... other UI elements for this page
}
]
Tab { // First tab
NavigationPane {
id: tmp_nav
Page {
ListView {
onTriggered: {
var pg = cmp_page.createObject()
tmp_nav.push(pg)
}
}
}
}
}
Tab { // Second Tab whose contents should be "cmp_page"
id: should_be_cmp_page
// ... UI elements, the same in cmp page
}
}
我正试图摆脱这种重复
我尝试了什么
should_be_cmp_page
方法中打开onTriggered
TypeError: Result of expression 'should_be_cmp_page.createObject' [undefined] is not a function.
NavigationPane
,我不认为将其作为唯一目的就是最理想的解决方案。答案 0 :(得分:1)
您不能只调用createObject方法。您必须将其分配给变量。
ListView {
onTriggered: {
var page = cmp_page.createObject()
tmp_nav.push(page)
}
}
答案 1 :(得分:1)
我可以为此建议2种解决方案。
“更简单”的解决方案是使用工作表来构成消息撰写视图而不是选项卡。这可以从任何地方打开,然后您可以将值传递到工作表中。
要使用该选项卡,需要一些c ++代码。我最近遇到过类似的问题,当用户点击另一个标签中的元素时,需要打开天气选项卡并在天气选项卡上显示5天的预测。但是,qml不支持打开选项卡。
我在c ++中制作了以下方法:
ApplicationUI.cpp
void ApplicationUI::openTab(QString tabName) {
Tab *mTab = tabbedPane->findChild<Tab*>(tabName);
if (mTab == 0) {
qDebug() << "Error: unable to open tab " << tabName;
return;
}
tabbedPane->setActiveTab(mTab);
}
ApplicationUI.hpp
public:
Q_INVOKABLE void openTab(QString tabName);
然后你可以这样做:
Tab { // First tab
NavigationPane {
id: tmp_nav
Page {
ListView {
onTriggered: {
var pg = cmp_page.createObject();
messageNav.push(pg);
}
}
}
}
}
Tab { // Second Tab whose contents should be "cmp_page"
NavigationPane {
id: messageNav
}
}