wxWidgets   Linux

ホーム   C/C++チュートリアル

wxWidgets


wxWidgets は、C++ で書かれた、人気のあるクロスプラットフォームな GUI アプリケーション・フレームワークです。


クロスプラットフォーム

クロスプラットフォーム(cross-platform)とは、Windows、macOS、Linux などの異なるオペレーティングシステムで、同じソースコードのプログラムを実行できる仕組みのことです。多くの場合、同じソースコードファイルを、それぞれの OS 上で、コンパイルするだけで実行できます。


GUI アプリケーション・フレームワーク

フレームワーク(framework)とは、何かをするために便利なように作られた関数などを集めたものです。GUI アプリケーション・フレームワークは、GUI アプリケーションを作るためのフレームワークです。


Ubuntu 18.04へのインストール


g++ --version
Command 'g++' not found, but can be installed with:

sudo apt install g++
もしくは
sudo apt install build-essential

g++ --version
g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

wx-config --version
Command 'wx-config' not found, but can be installed with:

sudo apt install libwxgtk3.0-dev

wx-config --version
3.0.4

もし今後次のようなメッセージが出たら
Failed to load module "canberra-gtk-module"
次もインストールします
sudo apt install libcanberra-gtk-module

// 余談 日本語パッケージのインストール
sudo apt install language-pack-ja
    


Fedora 30へのインストール


g++ --version
bash: g++: コマンドが見つかりませんでした...
コマンド g++’ を提供するためにパッケージ ’gcc-c++’ をインストールしますか? [N/y]
y
もしくは
sudo yum install gcc-c++
・・・
完了しました!

g++ --version
g++ (GCC) 9.2.1 20190827 (Red Hat 9.2.1-1)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

wx-config --version
bash: wx-config: コマンドが見つかりませんでした...
コマンド wx-config’ を提供するためにパッケージ ’wxBase3-devel’ をインストールしますか? [N/y] 
n
sudo yum install wxGTK3-devel
・・・
完了しました!

wx-config --version
3.0.4
    


CentOS 7へのインストール


g++ --version
bash: g++: コマンドが見つかりませんでした...

sudo yum install gcc-c++
・・・
完了しました!

g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

wx-config --version
bash: wx-config: コマンドが見つかりませんでした...

sudo yum install epel-release
完了しました!
sudo yum --enablerepo=epel install wxGTK3-devel
もしくは
sudo yum --enablerepo=epel install wxGTK3 wxGTK3-devel
・・・
完了しました!

wx-config --version
bash: wx-config: コマンドが見つかりませんでした...

//wxWidgetsのホームページよりLinux用の3.0.4バイナリをダウンロードしホームフォルダへ解凍
cd wxWidgets-3.0.4

./configure --with-gtk
・・・
以下が表示されれば完了です
Configured wxWidgets 3.0.4 for `x86_64-pc-linux-gnu’

  Which GUI toolkit should wxWidgets use?                 GTK+ 3 with support for GTK+ printing libnotify
  Should wxWidgets be compiled into single library?       no
  Should wxWidgets be linked as a shared library?         yes
  Should wxWidgets support Unicode?                       yes (using wchar_t)
  What level of wxWidgets compatibility should be enabled?
                                       wxWidgets 2.6      no
                                       wxWidgets 2.8      yes
  Which libraries should wxWidgets use?
                                       STL                no
                                       jpeg               builtin
                                       png                sys
                                       regex              builtin
                                       tiff               builtin
                                       zlib               sys
                                       expat              sys
                                       libmspack          no
                                       sdl                no

sudo make
・・・
この処理は時間がかかります
コマンドプロンプトへ戻れば完了です

sudo make install
・・・
以下が表示されれば完了です
------------------------------------------------------
 
 The installation of wxWidgets is finished.  On certain
 platforms (e.g. Linux) you’ll now have to run ldconfig
 if you installed a shared library and also modify the
 LD_LIBRARY_PATH (or equivalent) environment variable.
 
 wxWidgets comes with no guarantees and doesn’t claim
 to be suitable for any purpose.
 
 Read the wxWindows Licence on licencing conditions.
 
 ------------------------------------------------------
 
wx-config --version
3.0.4

// 余談 CentOSのバージョン確認
cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
    


Debian 9へのインストール


g++ --version
bash: g++: コマンドが見つかりません

sudo apt install g++

g++ --version
g++ --version
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 wx-config --version
bash: wx-config: コマンドが見つかりません

sudo apt install libwxgtk3.0-dev

wx-config --version
3.0.2

// 余談 Debianの日本語化
sudo apt install task-japanese locales-all
sudo apt install ibus-mozc
    


Mint 19へのインストール


g++ --version
Command 'g++' not found, but can be installed with:

sudo apt install g++
もしくは
sudo apt install build-essential

g++ --version
g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

wx-config --version
Command 'wx-config' not found, but can be installed with:

sudo apt install libwxgtk3.0-dev

wx-config --version
3.0.4
    


はじめの一歩


次のコードを、お好きなエディタで記述して、hello.cpp という名前でお好きな場所に保存してください。


hello.cpp


#include <wx/wx.h>

class Hello : public wxFrame
{
public:
    Hello();
};

class App : public wxApp
{
public:
    virtual bool OnInit();
};

Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"))
{
}

IMPLEMENT_APP(App)

bool App::OnInit()
{
    Hello *hello = new Hello();
    hello->Show();
    
    return true;
}
    


コード説明


#include <wx/wx.h>
    

wx/wx.h を読み込むと、wxWidgets 関連と C++ 関連のヘッダーファイルのほとんどを読み込めるみたいです。


class Hello : public wxFrame
{
public:
    Hello();
};
    

Hello クラスを定義しています。Hello クラスは wxFrame を継承しています。wxFrame はウィンドウを作るためのクラスです。public なアクセス権を持つ Hello() という関数は、クラスのインスタンスを作るコンストラクターになります。クラス名と同じ名前の関数はコンストラクターになります。コンストラクターには戻り値は指定しません。public な変数や関数は、他のクラスからもアクセスすることができます。クラスの定義(ヘッダー)の最後の }(中括弧)には ;(セミコロン)をつけなければなりません。


class App : public wxApp
{
public:
    virtual bool OnInit();
};
    

wxApp を継承した App というクラスを定義しています。wxApp クラスはアプリケーションの起動と終了、イベントループ(event loop)などを担当しています。App クラスには virtual で bool 型を返す OnInit( ) という関数が定義されています。virtual の付いた関数は仮想関数となり、 スーパークラスの型で呼びだせばスーパークラスの OnInit( ) が呼び出され、サブクラスの型で呼び出せばサブクラスの OnInit( ) が呼び出されます。wxApp の OnInit( ) は、ループ(起動し続けること)以外は何も実装していませんので、サブクラスで OnInit( ) を再定義しなければ、そのアプリケーションは何もせずに(ウィンドウも表示せずに)起動し続けるだけになります。


Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!")) {}
	

Hello クラスの Hello() 関数を実装しています。今回は何も実装していませんが、スーパークラスのコンストラクターを次のパラメーターで呼び出しています。

  1. NULL、親ウィンドウはないという意味です
  2. -1、id(一意な整数値)、-1 もしくは wxID_ANY とすると一意な整数値が得られます
  3. wxT("Hello wxWidgets!")、ウィンドウのタイトルバーに表示される文字列です。wxT() 関数を使うと日本語などの 2 バイト文字列も正しく表示されるようになります。英語などの 1 バイト文字列には、wxT() 関数を使わなくても大丈夫です。また macOS では日本語などの 2 バイト文字列でも wxT() 関数を使わなくても正常に表示されるみたいです。

IMPLEMENT_APP(App)
	

この部分は、main( ) 関数と、その main( ) 関数から引数で指定した wxApp のサブクラスの OnInit( ) 関数を呼び出すコードに置き換わります。このようにある文字列を一連のコードに結びつけたものをマクロと呼びます。C++ ではマクロは、すべて大文字で書く慣習になっています。またマクロの最後には ;(セミコロン)はつけません。


bool App::OnInit()
{
    Hello *hello = new Hello();
    hello->Show();
    
    return true;
}
	
  1. App クラスの OnInit() 関数を再定義しています。
  2. hello ポインターに Hello クラスのインスタンスを代入しています。
  3. hello ポインターに対して Show() 関数を呼び出しています。Show() 関数を呼び出さなければ、ウィンドウは表示されません
  4. 最後に true を返しています。true を返すとアプリケーションは継続し続け、false を返すとアプリケーションはその場で終了する仕組みになっています。

コンパイル


C++ のプログラムはコンパイル(compile)という作業をして実行ファイル(アプリケーション)を作ります。

ターミナルを起動して、hello.cpp を保存したディレクトリに移動し、次のコマンドを実行してください。


g++ hello.cpp `wx-config --cppflags --libs` -o hello
    
  1. g++ の次にスペースを空けてコンパイルしたいソースコードのファイルを指定します
  2. `wx-config --cppflags --libs` は、wxWidgets の関連ファイルをリンクさせます
  3. -o の次にスペースを空けてコンパイルで生成される実行ファイルの名前を指定します。-o 名前を省略した場合は、a.outという実行ファイルが作られます。

特に何も表示されずに、コマンドプロンプトに戻れば、コンパイルは成功しています。もしエラーや警告(warning)が表示されれば、それに従って対処してください。

コンパイルに成功すると、hello.cpp と同じディレクトに hello というファイルが出来上がります。これが実行ファイル(アプリケーション)です。

Fedora、CentOS、Ubuntu 16.04、Mint 18では、 コンパイルして出来上がった実行ファイルを、ダブルクリックで起動できます。 hello をデスクトップなどに移動させても、ダブルクリックで起動できます。しかしアイコンはシステムのデフォルトアイコンになります。

Dbian、Ubuntu 18.04、Mint 19では、コンパイルして出来上がった実行ファイルを ダブルクリックしても起動できません。アイコンもつきません。

ダブルクリックで起動できる場合もできない場合もターミナルで次のコマンドで実行できます。


./hello
もしくは
./a.out
    
CentOS 7
Mint 19

ウィンドウを閉じるとアプリケーションは終了します。


ウィンドウのデフォルトサイズは、プラットフォームによって違うみたいです。多くの場合、横 400 ピクセル、縦 500 ピクセルぐらいになる場合が多いみたいです。
次のようにコードを変更するとウィンドウのサイズを指定できます。


Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"))
        ↓
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"), wxDefaultPosition, wxSize(400, 250))
	
Mint 19

ウィンドウを閉じるとアプリケーションは終了します。


スタートメニューに登録する

スタートメニューに登録すると、 シングルクリックで起動できて任意のアイコンをつけることができます。 ダブルクリックで起動できたアプリケーションも、 できなかったアプリケーションも登録できます。 手順は次のとおりです。

  1. hello実行ファイルを /usr/bin へ移動もしくはコピーしてください。
  2. 次の hello.desktop ファイルを作成して /usr/share/applications へ保存してください。

hello.desktop


[Desktop Entry]
Type=Application
Version=1.0
Name=Hello
Exec=hello
Icon=orca
Comment=My first application.
Categories=
    
  1. Versionはアプリケーションのバージョンではなく、 デスクトップエントリーの仕様バージョンです。記述しなくても問題ありません。
  2. 実行ファイル(Exec)は/usr/binに存在するアプリケーションが 参照されます。
  3. アイコン(Icon)は/usr/share/icons/hiclor/scalable/apps に用意されている orca.svg を使いました。 パスを指定しない場合は自動的に前述のパスが参照されます。 パスを省略した場合は拡張子はつけません。
  4. コメント(Comments)が有効になるのは私が試した限りではMintだけでした。
  5. カテゴリー(Categories)は、指定の方法がわかりません。 指定しなければ「その他」に分類されます。 間違った指定をするとスタートメニューに登録されない場合もあります。
  6. 設定に間違いがないかどうかは次のコマンドで確認できます。 何も表示されなければエラーはありません。
    
    desktop-file-validate hello.desktop
        


これでスタートメニューにアイコンとコメント付で登録できました。 アプリケーションを起動するにはアイコンをシングルクリックします。

Ubuntu 18.04       orca.svg というアイコンを使っています
CentOS 7
Mint 19 Mate       mate.svg というアイコンを使っています

もし設定が反映されない場合は update-desktop-database というコマンドが使えるそうですが、私の環境ではエラーが出ます。
もし設定が反映されなければ再ログインもしくは再起動してください。 再ログインなしで設定が反映される場合もあります。


上記の設定ではシステム全体(全ユーザー対象)に設定されます。 個別のユーザー専用にするには次の通りにします。 なおシステム全体とユーザー専用の両方の設定があった場合は ユーザー専用が優先が動作します。

各ファイルを保存する場所


デスクトップエントリー([Desktop Entry])
/usr/share/applications                     // システム全体
~/.local/share/applications                 // ユーザー専用

アプリケーション(Exec)
/usr/bin                                    // システム全体
~/.local/shara/applications                 // ユーザー専用

アイコン(Icon)
/usr/share/icons/hicolor/scalable/apps      // システム全体
~/.local/share/applications                 // ユーザー専用
もしくは
~/.local/share/icons/hicolor/scalable/apps  // ユーザー専用
    

デスクトップエントリーも次のように変更します。

hello.desktop


[Desktop Entry]
Type=Application
Version=1.0
Name=Hello
Exec=/home/ユーザー名/.local/share/applications/hello
Icon=/home/ユーザー名/.local/share/applications/orca.svg
Comment=My first application.
Categories=
    

ユーザー専用設定では、ExecとIconはフルパスで指定します。

システムで用意されているアイコンを使う場合は必ずコピーをして使ってください。 アイコン本体を移動させると、 そのアイコンを必要とするアプリケーションから使えなくなります。



9208 visits
Posted: Jan. 12, 2020
Update: Jan. 13, 2020

ホーム   C/C++チュートリアル   目次