タスクトレイに常駐してホットキーでウィンドウが表示されるアプリケーションのサンプル

QuickSilverとかGnomeDoとか、ああいう感じのソフトが作りたいのでその第一歩。

Windowsアプリケーション開発は少しだけ経験がありますが、Qtは最近はじめたばかりです。

では早速。

新規プロジェクト > Qtウィジェットプロジェクト > QtGUIアプリケーション を選択

名前を適当につける。あたしはSystemTraySampleと名づけました。

デスクトップ
Qtバージョン毎にDebugとReleaseを1つずつ
シャドウビルドを使用

クラス名を適当につける。あたしはSystemTraySampleと名づけました。
基底クラスをQWidgetに。
フォームを生成するにチェックをつける。

完了ボタンをクリック。

Qxtを使うために、前回書いたように以下を.proに追加

CONFIG += qxt

QXT_DIR = C:\Qxt
INCLUDEPATH += C:\Qxt\include\QxtGui
INCLUDEPATH += C:\Qxt\include\QxtCore
LIBS += -LC:\Qxt\lib
QXT += gui core

あとは、QtのSystem Tray Icon Exampleを参考に

// systemtraysample.h
#ifndef SYSTEMTRAYSAMPLE_H
#define SYSTEMTRAYSAMPLE_H

#include <QWidget>

class QSystemTrayIcon;
class QMenu;

namespace Ui {
class SystemTraySample;
}

class SystemTraySample : public QWidget
{
    Q_OBJECT
    
public:
    explicit SystemTraySample(QWidget *parent = 0);
    ~SystemTraySample();
    
protected:
    void closeEvent(QCloseEvent *);
    
private:
    Ui::SystemTraySample *ui;
    
    void createTrayIcon();
    void createActions();
    
    QSystemTrayIcon* trayIcon;
    QMenu* trayIconMenu;
    QAction *minimizeAction;
    QAction *maximizeAction;
    QAction *restoreAction;
    QAction *quitAction;
    
};

#endif // SYSTEMTRAYSAMPLE_H
//SystemTraySample.cpp
#include "systemtraysample.h"
#include "ui_systemtraysample.h"

#include <QxtGlobalShortcut>
#include <QMenu>
#include <QSystemTrayIcon>
#include <QCloseEvent>

SystemTraySample::SystemTraySample(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SystemTraySample)
{
    ui->setupUi(this);

    createActions();
    createTrayIcon();

    QxtGlobalShortcut *shortcut = new QxtGlobalShortcut(this);
    shortcut->setShortcut(QKeySequence("Ctrl+Shift+F12"));

    connect(shortcut, SIGNAL(activated()),
            this,     SLOT(showNormal()));
}

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

void SystemTraySample::createTrayIcon()
{
    trayIconMenu = new QMenu(this);
    trayIconMenu->addAction(minimizeAction);
    trayIconMenu->addAction(maximizeAction);
    trayIconMenu->addAction(restoreAction);
    trayIconMenu->addSeparator();
    trayIconMenu->addAction(quitAction);

    trayIcon = new QSystemTrayIcon(this);
    trayIcon->setContextMenu(trayIconMenu);
    trayIcon->setIcon(QIcon(":/trash.svg"));
    trayIcon->show();
}

void SystemTraySample::createActions()
{
    minimizeAction = new QAction(tr("Mi&nimize"), this);
    connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide()));

    maximizeAction = new QAction(tr("Ma&ximize"), this);
    connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized()));

    restoreAction = new QAction(tr("&Restore"), this);
    connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));

    quitAction = new QAction(tr("&Quit"), this);
    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
}

void SystemTraySample::closeEvent(QCloseEvent *event)
{
    if (trayIcon->isVisible()) {
        hide();
        event->ignore();
    }
}

コンストラクタ内の

    QxtGlobalShortcut *shortcut = new QxtGlobalShortcut(this);
    shortcut->setShortcut(QKeySequence("Ctrl+Shift+F12"));

    connect(shortcut, SIGNAL(activated()),
            this,     SLOT(showNormal()));

でウィンドウがアクティブじゃなくても利用可能なショートカットキー(グローバルショートカット?)を作成して、それが押されたら何をするか(showNormal())を設定します。


ついでにいまさらながらgithubも初めて使ってみました。
https://github.com/TakahashiShuuhei/SystemTraySample