2016-04-28 32 views
1

我有一个C++/QML应用程序和一个C++ QObject,我想从中更改托盘图标。托盘图标在main.cpp中创建,因为它需要此对象的QQmlApplicationEngine的根对象。查找不是儿童的QObject

main.cpp看起来是这样的:

qmlRegisterType<Model>("Model", 1,0, "Model"); 
QQmlApplicationEngine engine; 
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
QObject *root = 0; 
if (engine.rootObjects().size() > 0) 
{ 
    root = engine.rootObjects().at(0); 
    [...] 
    QSystemTrayIcon *trayIcon = new QSystemTrayIcon(root); 
    trayIcon->setObjectName("TrayIcon"); 
    [...] 
} 

而且我有一个名为QObject模型,我从QML代码中实例化。

一切工作正常,但现在我想从模型中更改托盘图标的图标。看来我的模型没有父级,我的想法是通过给它一个objectName并在我的模型中再次搜索它来获取托盘图标。但是如果我无法到达根对象并且托盘图标也不是我的孩子,我该如何搜索它?

+0

如果它不在根对象树中,则无法找到它。按照库巴的建议并将其作为上下文属性公开。 – dtech

回答

0

QSystemTrayIcon公开为QML,就像处理任何其他对象一样。很可能,您可以将托盘图标作为根上下文属性添加到QML。

+0

我不确定这会有什么帮助。我不想从Qml访问TrayIcon,而是从我的QObject实例访问。我如何从那里搜索它? – Fabian

+0

@Fabian由于您从QML实例化了QObject,因此QML必须知道托盘图标实例。因此,您将它传递给QML,然后在实例化对象时从QML中移出。 –

+0

小样本应用程序现在位于:https://github.com/sturmf/qt_samples/tree/master/trayicon我现在使用全局变量将rootObject传递给模型实例。但这真是太麻烦了。也许你可以看看并告诉我如何改进代码。我曾经有一个版本,我注册了QSystemTrayIcon类的QML,并在那里实例化了,但是这似乎只有一半,就像我一样。无法在QMl中创建QIcons,并且onActivated信号处理程序不会收到原因参数... – Fabian