Πώς να χρησιμοποιήσετε το systemtray με την Qt

Στο πλαίσιο εκμάθησης της Qt ήθελα να κάνω μια απλή εφαρμογή που να χρησιμοποιεί το systemtray.

Δυστυχώς το παράδειγμα του systemtray που έχει η Qt είναι πολύπλοκο μιας και δημιουργεί μια φόρμα παραθύρου με κώδικα. Μέσα σε αυτόν τον κώδικα υπάρχει και ο κώδικας για το systemtray πράγμα που καθιστά το παράδειγμα δυσνόητο.

Έτσι απόφάσησα να κάνω το δικό μου απλό παράδειγμα.

1) Αρχικά δημιουργούμε ένα Νέο Project στο Qt Creator.

2) Επιλέγουμε Qt Widgets Application

qt-system-tray-code

3) Στην συνέχεια ονομάζουμε το project μας ως ToSystemTray

qt-system-tray-code

4) Επιλέγουμε kit την Qt 5.6.0

qt-system-tray-code

5) Αφήνουμε ως έχει το Class Information πατώντας Next

qt-system-tray-code

6) Δεν επιλέγουμε κάποιο version control πατώντας Finish

qt-system-tray-code

Μέχρι εδώ έχουμε δημιουργήσει μια τυπική GUI εφαρμογή.

6) Προσθέτουμε ένα resource pack στην εφαρμογή μας κάνοντας δεξί κλικ στο όνομα του project και πατώντας Add New -> Qt -> Qt Resource File. Ονομάζουμε το αρχείο ως resources.qrc

qt-system-tray-code

7) Αποθηκεύουμε στο φάκελο του προγράματος ένα αρχείο εικόνας png που θα το χρησιμοποιήσουμε ως εικονίδιο για το system tray. Εδώ εγώ κατέβασα από το openclipart.org μια εικόνα από ένα μολύβι.

qt-system-tray-code

8) Προσθέτουμε το Πρόθεμα / στο αρχείο resources.qrc και επίσης το εικονίδιο pencil.png

qt-system-tray-code

Ήρθε η ώρα να πάμε στον κώδικα.

9) Ανοίγουμε το αρχείο mainwindow.h και συμπληρώνουμε τον κώδικα όπως παρακάτω.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QIcon>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QSystemTrayIcon *tray;
    QMenu *trayIconMenu;
    QAction *restoreAction;
    QIcon trayIcon;
    void createTray();
};

#endif // MAINWINDOW_H

Οι γραμμές

#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QIcon>

είναι οι απαραίτητες βιβλιοθήκες που με την βοήθεια τους θα δημιουργήσουμε το εικονίδιο στο system tray.

Ως private προσθέτουμε τις παρακάτω γραμμές.

    QSystemTrayIcon *tray;
    QMenu *trayIconMenu;
    QAction *restoreAction;
    QIcon trayIcon;
    void createTray();

ο δείκτης *tray είναι το εικονίδιο στο system tray

Όταν κάνουμε δεξί κλικ στο εικονίδιο ένα μενού εμφανίζεται με κάποια actions.

Το menu είναι το *trayIconMenu, ενώ το action είναι το *restoreAction

Επίσης το trayIcon είναι το εικονίδιο «μολύβι» από το resource pack.

Στη συνάρτηση createTray θα γράψουμε τον κώδικα που θα δημιουργεί το system tray icon.

10) Στην συνέχεια ανοίγουμε το αρχείο mainwindow.ui στον Designer και προσθέτουμε ένα PushButton

qt-system-tray-code

11) Με δεξί κλικ και GoTo Slot … επιλέγουμε το slot clicked και στην συνάρτηση που μας βγάζει γράφουμε τον παρακάτω κώδικα.

void MainWindow::on_pushButton_clicked()
{
    this->hide();
}

Έτσι όταν πατούμε το button το παράθυρο θα κρύβεται.

12) Γράφουμε τον κώδικα του αρχείου mainwindow.cpp
Αρχικά γράφουμε την συνάρτηση που θα δημιουργεί το system tray icon

void MainWindow::createTray(){

    //create tray
    tray= new QSystemTrayIcon(this);

    //setup tray icon
    QPixmap icon(":/pencil.png");
    trayIcon= QIcon(icon);
    tray->setIcon(trayIcon);
    tray->setToolTip("ToolTip");

    //setup restore

    restoreAction = new QAction(QIcon(":/pencil.png"), "Restore", this);
    connect(restoreAction, SIGNAL(triggered()), this, SLOT(show()));

    //create system tray menu
    trayIconMenu = new QMenu(this);
    trayIconMenu->addAction(restoreAction);
    tray->setContextMenu(trayIconMenu);

    tray->setVisible(true);
}

Στον constructor της MainWindow καλούμε την συνάρτηση createTray

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
createTray();
}

Συνολικά το αρχείο mainwindow.cpp έχει τον κώδικα:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPixmap>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
createTray();
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_pushButton_clicked()
{
this->hide();
}

void MainWindow::createTray(){

//create tray
tray= new QSystemTrayIcon(this);

//setup tray icon
QPixmap icon(":/pencil.png");
trayIcon= QIcon(icon);
tray->setIcon(trayIcon);
tray->setToolTip("ToolTip");

//setup restore
restoreAction = new QAction(QIcon(":/pencil.png"), "Restore", this);
connect(restoreAction, SIGNAL(triggered()), this, SLOT(show()));

//create system tray menu
trayIconMenu = new QMenu(this);
trayIconMenu->addAction(restoreAction);
tray->setContextMenu(trayIconMenu);

tray->setVisible(true);
}

Αυτό ήταν όλο. Με αυτόν το πρότυπο κώδικα έχουμε ένα λειτουργικό εικονίδιο στο systemtray.

Μπορείτε να κατεβάσετε τον κώδικα από εδώ :

Απορίες, παρατηρήσεις, ιδέες... Ελεύθερα ! Πες την άποψή σου... έστω και Ανώνυμα:

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s