2014-06-26 35 views
6

Bir QtQuick masaüstü uygulaması yazıyorum. İçinde hem C++ (işlevsellik için) hem de QML (UI için) kullanıyorum. QML'de yazılan arabirimi göstermek için QQuickView kullanıyorum.Qt Quick uygulamasında SystemTrayIcon işlevselliğinin uygulanması mümkün mü

Bu uygulamanın, simge durumuna küçültüldüğünde Sistem Tepsisinde bulunması istiyorum.

Bu örneğe benzer bir işlevi kastediyorum. http://qt-project.org/doc/qt-4.8/desktop-systray.html. Bu özelliği uygulamaya çalışıyorum ancak Qt Quick uygulamasında bunu yapmanın bir yolunu bulamadım.

#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(); 
} 

bunu yapmak için herhangi bir ipucu/işaretçileri sağlayarak yardımcı olun:

İşte benim main.cpp kodudur.

Teşekkürler.

+0

Bunu yalnızca QML ile mi yapmaya çalışıyorsunuz, yoksa C++/Qt kullanılabilir mi? – BlueMagma

+0

Merhaba BlueMagma, C++/Qt kullanılabilir. Kullanıcı arayüzüm QML kullanılarak oluşturuldu ve bunu Qt main.cpp dosyasından başlatıyorum. Main.cpp dosya kodumu sorumu yeni güncelledim. – Mugunth

cevap

-2

Kopya Windos sınıf projenize Systray örnekten (window.cpp/window.h), Qt5 için de kullanılabilir hale ana dosyadan hem gerekli ve açık ise:

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

    Window window; 
    window.show(); 

    return app.exec(); 
} 
+0

Merhaba Sion Wart, window.cpp & window.h dosyalarını nereden alabilirim? – Mugunth

+0

Systray örneğinden windows.cpp /windows.h dosyalarını kastettiğinizi anlıyorum. Onları denedim ve işe yaradım. Ama her ikisi de Windows (Window.cpp & QML tarafından oluşturulan qml tabanlı pencere (QQuickView yoluyla) görünür. Bu benim gereksinimi çözmez. Onları nasıl integrete. Mümkünse pls daha fazla bilgi verin. – Mugunth

+0

Artık entegre etmeniz gerekecek. C++ 'daki işlevselliğiniz 'Window' sınıfını ihtiyaçlarınıza göre değiştirin ve ana programınız ile' Window' arasında sinyaller göndermeye başlayın, örneğin simgeyi göstermek/gizlemek/değiştirmek için: –

12

aynı bakıyordu Bugün meydan okuma ve main() içinde aşağıdaki çözümü kullanarak sona erdi. Qt 5.3 kullanırken benim için harika çalışıyor. Elbette, ilk kök nesnenin uygulama penceresi nesnesinin olup olmadığını kontrol etmenin daha iyi bir yolunu uygulamanız gerekir.

#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

Eksiler: Qt5Widgets modülünün bağımlılığına neden olur. sistem tepsisini düz qml'den kullanmak mümkün değildir. –

İlgili konular