wxWidgets は、C++ で書かれた、人気のあるクロスプラットフォームな GUI アプリケーション・フレームワークです。
クロスプラットフォーム(cross-platform)とは、Windows、macOS、Linux などの異なるオペレーティングシステムで、同じソースコードのプログラムを実行できる仕組みのことです。多くの場合、同じソースコードファイルを、それぞれの OS 上で、コンパイルするだけで実行できます。
フレームワーク(framework)とは、何かをするために便利なように作られた関数などを集めたものです。GUI アプリケーション・フレームワークは、GUI アプリケーションを作るためのフレームワークです。
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
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
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)
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
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 という名前でお好きな場所に保存してください。
#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() 関数を実装しています。今回は何も実装していませんが、スーパークラスのコンストラクターを次のパラメーターで呼び出しています。
IMPLEMENT_APP(App)
この部分は、main( ) 関数と、その main( ) 関数から引数で指定した wxApp のサブクラスの OnInit( ) 関数を呼び出すコードに置き換わります。このようにある文字列を一連のコードに結びつけたものをマクロと呼びます。C++ ではマクロは、すべて大文字で書く慣習になっています。またマクロの最後には ;(セミコロン)はつけません。
bool App::OnInit()
{
Hello *hello = new Hello();
hello->Show();
return true;
}
C++ のプログラムはコンパイル(compile)という作業をして実行ファイル(アプリケーション)を作ります。
ターミナルを起動して、hello.cpp を保存したディレクトリに移動し、次のコマンドを実行してください。
g++ hello.cpp `wx-config --cppflags --libs` -o hello
g++
の次にスペースを空けてコンパイルしたいソースコードのファイルを指定します`wx-config --cppflags --libs`
は、wxWidgets の関連ファイルをリンクさせます-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
ウィンドウのデフォルトサイズは、プラットフォームによって違うみたいです。多くの場合、横 400 ピクセル、縦 500 ピクセルぐらいになる場合が多いみたいです。
次のようにコードを変更するとウィンドウのサイズを指定できます。
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"))
↓
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"), wxDefaultPosition, wxSize(400, 250))
スタートメニューに登録すると、 シングルクリックで起動できて任意のアイコンをつけることができます。 ダブルクリックで起動できたアプリケーションも、 できなかったアプリケーションも登録できます。 手順は次のとおりです。
/usr/bin
へ移動もしくはコピーしてください。 hello.desktop
ファイルを作成して
/usr/share/applications
へ保存してください。
[Desktop Entry]
Type=Application
Version=1.0
Name=Hello
Exec=hello
Icon=orca
Comment=My first application.
Categories=
/usr/bin
に存在するアプリケーションが
参照されます。/usr/share/icons/hiclor/scalable/apps
に用意されている orca.svg
を使いました。
パスを指定しない場合は自動的に前述のパスが参照されます。
パスを省略した場合は拡張子はつけません。
desktop-file-validate hello.desktop
これでスタートメニューにアイコンとコメント付で登録できました。 アプリケーションを起動するにはアイコンをシングルクリックします。
もし設定が反映されない場合は 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 // ユーザー専用
デスクトップエントリーも次のように変更します。
[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はフルパスで指定します。
システムで用意されているアイコンを使う場合は必ずコピーをして使ってください。 アイコン本体を移動させると、 そのアイコンを必要とするアプリケーションから使えなくなります。