2016-04-29 5 views
1

Ich möchte ein Signal, das von einem C++ - QObject erzeugt wird, mit einer Funktion in einem QML-Element verbinden. Das Signal ist das "aktivierte" Signal von einem QSystemTrayIcon und sein Argument ist ActivationReason (ein Enum-Wert).Wie verbinde ich ein Signal von C++ mit der QML-Funktion mit Parameter

Leider kann ich kein Signal mit dieser Signatur an einen Slot anschließen, der nur QVariant zu empfangen scheint.

In der QML-Datei

function trayIconClicked(reason) { ... } 

In dem C++ Code

QObject::connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), rootObject, SLOT(trayIconClicked(QVariant))); 

Und das ist, was ich

QObject::connect: Incompatible sender/receiver arguments 
     QSystemTrayIcon::activated(QSystemTrayIcon::ActivationReason) --> ApplicationWindow_QMLTYPE_11_QML_60::trayIconClicked(QVariant) 

bekommen Wenn ich das Argument auf der Schlitzseite komplett über Bord werfen, Das Ereignis ruft die Funktion auf. Aber dann habe ich keine Ahnung was ActivationReason ausgelöst hat.

Eine vollständige Version des obigen Codes ist hier, außer, dass ich im Grunde Parameter nicht übergeben kann jetzt https://github.com/sturmf/qt_samples/tree/master/trayicon

+0

vielleicht diese Seite Hilfe Sie: http://stackoverflow.com/questions/8834147/c-signal-to-qml-slot-in-qt – aghilpro

+0

leider nicht, ich lese diese vor Antwort. Er hat Glück, dass beide Seiten, Signal und Slot zu QVariant geändert werden können. Ich habe den festen Parameter von der QSystemTrayIcon. Ich kenne auch einen Zwischenschlitz, der für die Übersetzung verwendet werden könnte. Aber mein Code lebt in der Hauptfunktion des C++ - Codes, wo ich kein QObject habe, das als Zwischenprodukt funktionieren könnte. – Fabian

+0

@Fabian - Umwandlung in 'QVariant' wird für QML-C++ - Interop benötigt, Sie können den benutzerdefinierten Typ als Metatyp registrieren, damit er von einer Variante umschlossen werden kann, damit er an die QML-Seite übergeben werden kann. – dtech

Antwort

0

ich die QSystemTrayicon subclassed und hat einen Schlitz, der ohne den Parameter ein anderes Signal aussendet.

#ifndef TRAYICON_H 
#define TRAYICON_H 
#include <iostream> 
#include <QObject> 
#include <QSystemTrayIcon> 

class TrayIcon : public QSystemTrayIcon 
{ 
    Q_OBJECT 
public: 
    explicit TrayIcon(QObject *parent = 0) : QSystemTrayIcon(parent){} 

signals: 
    void triggered(); 

public slots: 
    void trayIconActivated(QSystemTrayIcon::ActivationReason reason) { 
     std::cout << "activated" << std::endl; 
     if (reason == QSystemTrayIcon::Trigger) { 
      std::cout << "tiggered" << std::endl; 
      emit triggered(); 
     } 
    } 
}; 

#endif // TRAYICON_H 
0

In Qt5 können Sie übrigens eine Verbindung zu einer anonymen Funktion herstellen.

QObject::connect(trayIcon 
    , SIGNAL(activated(QSystemTrayIcon::ActivationReason)) 
    , [=](QSystemTrayIcon::ActivationReason r){ 
       rootObject->trayIconClicked(r); 
      }); 
+0

Wie emittiere ich ein beliebiges Signal in RootObject? – Sassan

+0

Meinst du, wie kann ein beliebiges Signal von einem Objekt aus einer Methode von RootObject emittiert werden? Sie können das Signal eines RootObject mit diesem Signal verbinden und das letztere ausgeben. – bipll