Στο πλαίσιο εκμάθησης της Qt ήθελα να κάνω μια απλή εφαρμογή που να χρησιμοποιεί το systemtray.
Δυστυχώς το παράδειγμα του systemtray που έχει η Qt είναι πολύπλοκο μιας και δημιουργεί μια φόρμα παραθύρου με κώδικα. Μέσα σε αυτόν τον κώδικα υπάρχει και ο κώδικας για το systemtray πράγμα που καθιστά το παράδειγμα δυσνόητο.
Έτσι απόφάσησα να κάνω το δικό μου απλό παράδειγμα.
1) Αρχικά δημιουργούμε ένα Νέο Project στο Qt Creator.
2) Επιλέγουμε Qt Widgets Application
3) Στην συνέχεια ονομάζουμε το project μας ως ToSystemTray
4) Επιλέγουμε kit την Qt 5.6.0
5) Αφήνουμε ως έχει το Class Information πατώντας Next
6) Δεν επιλέγουμε κάποιο version control πατώντας Finish
Μέχρι εδώ έχουμε δημιουργήσει μια τυπική GUI εφαρμογή.
6) Προσθέτουμε ένα resource pack στην εφαρμογή μας κάνοντας δεξί κλικ στο όνομα του project και πατώντας Add New -> Qt -> Qt Resource File. Ονομάζουμε το αρχείο ως resources.qrc
7) Αποθηκεύουμε στο φάκελο του προγράματος ένα αρχείο εικόνας png που θα το χρησιμοποιήσουμε ως εικονίδιο για το system tray. Εδώ εγώ κατέβασα από το openclipart.org μια εικόνα από ένα μολύβι.
8) Προσθέτουμε το Πρόθεμα / στο αρχείο resources.qrc και επίσης το εικονίδιο pencil.png
Ήρθε η ώρα να πάμε στον κώδικα.
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
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.
Μπορείτε να κατεβάσετε τον κώδικα από εδώ :
Σου άρεσε το άρθρο; Πες την άποψή σου... έστω και Ανώνυμα: