2014-06-26 14 views
6

Sto scrivendo un'applicazione desktop QtQuick. Io uso sia C++ (per la funzionalità) che QML (per l'interfaccia utente) in esso. Uso QQuickView per mostrare l'interfaccia scritta in QML.È possibile implementare la funzionalità SystemTrayIcon nell'applicazione Qt Quick

Desidero che questa applicazione risieda in System Tray quando è ridotta a icona.

Intendo una funzionalità simile a questo esempio. http://qt-project.org/doc/qt-4.8/desktop-systray.html. Sto cercando di implementare questa funzione ma non sono riuscito a trovare un modo per farlo nella mia applicazione Qt Quick.

Ecco il mio codice main.cpp:

#include <QGuiApplication> 
#include <QQmlEngine> 
#include <QQmlContext> 
#include <QQmlFileSelector> 
#include <QQuickView> 
#include "myapp.h" 

int main(int argc, char* argv[]) 
{ 
    QGuiApplication app(argc,argv); 
    app.setApplicationName(QFileInfo(app.applicationFilePath()).baseName()); 
    QDir::setCurrent(qApp->applicationDirPath()); 

    MyApp myappObject; 

    QQuickView view; 

    view.connect(view.engine(), SIGNAL(quit()), &app, SLOT(quit())); 
    view.rootContext()->setContextProperty("myappObject", &myappObject); 
    new QQmlFileSelector(view.engine(), &view); 

    view.setSource(QUrl("qrc:///myapp.qml")); 

    view.setResizeMode(QQuickView::SizeRootObjectToView); 
    view.show(); 

    return app.exec(); 
} 

Aiutateci fornendo alcun suggerimento/puntatori a fare questo.

Grazie.

+0

Si sta provando a farlo solo con QML oppure si può utilizzare C++/Qt? – BlueMagma

+0

È possibile utilizzare Hi BlueMagma, C++/Qt. La mia interfaccia utente è stata creata utilizzando QML e l'avvio dal file Qt main.cpp. Ho appena aggiornato il mio codice file main.cpp nella mia domanda. – Mugunth

risposta

-2

Copia la classe Windos (window.cpp/window.h) dall'esempio systray al progetto, porta a QT5 se necessario, e aperto sia dal file principale:

int main(int argc, char* argv[]) 
{ 
    // ... 
    QQuickView view; 
    // ... 
    view.show(); 

    Window window; 
    window.show(); 

    return app.exec(); 
} 
+0

Ciao Sion Wart, dove posso prendere i file window.cpp e window.h? – Mugunth

+0

Capisco che intendevi i file windows.cpp /windows.h dall'esempio systray. Li ho provati e fatto funzionare. Ma entrambi Windows (uno proveniente da Window.cpp e la finestra basata su qml creata da QML (tramite QQuickView) vengono visualizzati .Non risolve il mio requisito.Per integrarli.Possibile se i pls forniscono ulteriori dettagli. – Mugunth

+0

Ora sarà necessario integrare la tua funzionalità in C++ Modifica la classe 'Window' in base alle tue esigenze e inizia a inviare segnali tra il tuo programma principale e' Window', ad esempio per mostrare/nascondere/modificare l'icona. –

12

stavo affrontando lo stesso sfida oggi e ha finito per utilizzare la seguente soluzione all'interno di main(). Funziona alla grande per me quando uso Qt 5.3. Ovviamente si dovrebbe implementare un modo migliore per verificare se il primo oggetto radice è o meno l'oggetto della finestra dell'applicazione.

#include <QApplication> 
#include <QQmlApplicationEngine> 
#include <QMessageBox> 
#include <QAction> 
#include <QMenu> 
#include <QSystemTrayIcon> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    if (!QSystemTrayIcon::isSystemTrayAvailable()) { 
     QMessageBox::critical(0, QObject::tr("Systray"), 
           QObject::tr("I couldn't detect any system tray " 
              "on this system.")); 
     return 1; 
    } 
    QApplication::setQuitOnLastWindowClosed(false); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); 

    QObject *root = 0; 
    if (engine.rootObjects().size() > 0) 
    { 
     root = engine.rootObjects().at(0); 

     QAction *minimizeAction = new QAction(QObject::tr("Mi&nimize"), root); 
     root->connect(minimizeAction, SIGNAL(triggered()), root, SLOT(hide())); 
     QAction *maximizeAction = new QAction(QObject::tr("Ma&ximize"), root); 
     root->connect(maximizeAction, SIGNAL(triggered()), root, SLOT(showMaximized())); 
     QAction *restoreAction = new QAction(QObject::tr("&Restore"), root); 
     root->connect(restoreAction, SIGNAL(triggered()), root, SLOT(showNormal())); 
     QAction *quitAction = new QAction(QObject::tr("&Quit"), root); 
     root->connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); 

     QMenu *trayIconMenu = new QMenu(); 
     trayIconMenu->addAction(minimizeAction); 
     trayIconMenu->addAction(maximizeAction); 
     trayIconMenu->addAction(restoreAction); 
     trayIconMenu->addSeparator(); 
     trayIconMenu->addAction(quitAction); 

     QSystemTrayIcon *trayIcon = new QSystemTrayIcon(root); 
     trayIcon->setContextMenu(trayIconMenu); 
     trayIcon->setIcon(QIcon(":/resources/DatagnanLogoColor.png")); 
     trayIcon->show(); 
    } 

    return app.exec(); 
} 
+0

Contro: causa la dipendenza del modulo Qt5Widgets. che non è possibile utilizzare la barra delle applicazioni da qml semplice. –

Problemi correlati