Runner in the High

技術のことをかくこころみ

libnotifyをQtで使う

今日はUbuntuユーザーにはお馴染みのNotify(?)をQtで表示してみようかと思います。
(この記事で作ったプロジェクトは IzumiSy/libnotify-on-Qtです)

Ubuntuユーザー馴染みのNotifyメッセージ
 

知っている方も多いと思いますが、QtにはQSystemTrayIconというクラスがあります。
一応これを使ってもメッセージのバルーンを表示することは出来るのですが、どうも環境に依存しないタイプのポップアップしか出せないらしく、Ubuntuにおいても下のように吹き出し型のものになってしまいます。

QSystemTrayIconをWindowsで用いた例。
Ubuntuにおいても同様のスタイルで表示される。

ということで、上のほうのカッコいいやつ(Ubuntu独自のバルーン)をさっそくQtで表示させていきます。

STEP1. libnotify-devをインストールする

実は意外と多い最初のトラブルがこれと関連している。
導入されないとnotify.hが見つからなくてイライラする

 
ソースコードのビルドの際にglib.hが見つからないのでこれも導入する

STEP3. pkg-configのサポート

# To support for pkg-config
CONFIG += link_pkgconfig
PKGCONFIG += libnotify
これをproファイルのどこか適当に追加しておく

ここまでで一応必要な材料はすべて揃ったのだが、このままビルドすると、Qtによって定義されている signals という定数と、Gtkによって定義される変数の名前との間に定義衝突が発生し、ビルドエラーを引き起こす。ということで、下記の情報を参考に、然るべき場所にて signals を定義破棄する必要がある

How to prevent symbol collisions between GTK+ and Qt - Nokia Developer

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <qmainwindow>

// To prevent prevent symbol collisions between GTK+ and Qt
#undef signals

#include <libnotify⁄notify.h>

namespace Ui {
class MainWindow;
}
libnotify/notify.h をインクルードし、適切な箇所に表示に必要なコードを書く。
関数について詳しくは検索のこと。
void MainWindow::on_pushButton_clicked()
{
notify_init("Hello World");
NotifyNotification *hello =
notify_notification_new("Hello world",
"This is an example notification.",
"dialog-information");
notify_notification_show(hello, NULL);
}

やったね!表示されたよ!