Qt
Qt はクロスプラットフォームのアプリケーション・ウィジェットツールキットです。標準の C++ を使っていますが言語機能を強化するために特別なコードジェネレータ (Meta Object Compiler もしくは moc) とマクロをフルに活用しています。主な特徴として:
- 主要なデスクトッププラットフォームと複数のモバイルプラットフォームで動作します。
- 完全な国際化サポート。
- SQL データベースのアクセス、XML のパース、スレッド管理、ネットワークのサポートを提供するライブラリと、ファイルを処理するための統一されたクロスプラットフォームのアプリケーションプログラミングインタフェース (API)。
Qt フレームワークは主要な開発プラットフォームの一つとして、KDE ソフトウェアコミュニティや VLC, VirtualBox, Opera, Mathematica, Skype などオープンソース・プロプライエタリ問わず様々なアプリケーションで使われています。
インストール
現在公式リポジトリでは2つのバージョンの Qt が利用可能です。以下のパッケージでインストールできます:
- Qt 5.x は qt5-base パッケージでインストールできます。ドキュメントは qt5-doc パッケージに入っています。
- Qt 4.x は qt4 パッケージでインストールできます。ドキュメントは qt4-docAUR パッケージに入っています。
- Qt 3.x は qt3AUR パッケージでインストールできます。ドキュメントは qt3-docAUR パッケージに入っています。
Qt5 プラットフォームプラグインと依存パッケージ
qt5-base を使うと Qt5 がインストールされます。Qt5 は platform abstractions を利用しますが、プラットフォームアブストラクションのプラグインの依存パッケージが足りないことがあります。Qt は依存パッケージの依存関係を解決する代わりに、プラグインが使えないという表示をします。例えば、アプリケーションが xcb に依存していて、xcb ライブラリの依存パッケージがインストールされていない場合、Qt は以下のように報告します:
This application failed to start because it could not find or load the Qt platform plugin "xcb". Available plugins are: xcb. Reinstalling the application may fix this problem.
Qt5 のページではインストールするべき パッケージのリスト を公開していますが、何も考えず全てのパッケージをインストールするのは Arch ライクとは言えないでしょう。代わりに、(上記の xcb の場合、libqxcb.so) プラグインを確認して、ldd を使ってインストールされていない依存パッケージを確認することができます。その依存パッケージをインストールすることで問題は解決するはずです。
デフォルトの Qt ツールキット
qtchooser をインストールすることで /usr/bin に在来のバイナリ (例: qmake) を復活させて使用する Qt ツールキットを設定できます。デフォルトでは Qt5 が使われます。
環境変数を使う
デフォルトの Qt ツールキットを定義するには、QT_SELECT 環境変数を作成します。例えば、Qt4 に設定するには、シェルの初期化ファイル (~/.bash_profile や ~/.zsh_profile など) で export QT_SELECT=4 を実行してください。
設定ファイルを使う
/etc/xdg/qtchooser/ ディレクトリの .conf ファイルに ~/.config/qtchooser/default.conf からシンボリックリンクを張ればデフォルトの Qt ツールキットを設定できます。例えば、Qt4 に設定するには /etc/xdg/qtchooser/4.conf から ~/.config/qtchooser/default.conf にリンクするシンボリックリンクを作成します:
$ ln -s/etc/xdg/qtchooser/4.conf~/.config/qtchooser/default.conf
外観
Qt4
Qt4 のアプリケーションは動作しているデスクトップ環境の挙動を模倣しようとします、ただし、なにか問題が発生したり、設定がハードコードされている場合は別です。
- KDE 4 では、KDE で選択された Qt スタイルが使われます。KDE System Settings (systemsettings) を使って設定することができます。設定項目は Common Appearance and Behavior > Application Appearance > Style > Widget Style にあります。
- KDE Plasma 5 では、Plastique が使われます。
- Cinnamon, GNOME, Xfce では GTK+ が使われます (QGtkStyle)。
- 他のデスクトップ環境では、Windows が使われます。
Qt4 アプリケーションのルックアンドフィールを変更したい場合は、Qt 設定 (qtconfig-qt4) ツールが使えます。QtConfig を使うことで Qt4 アプリケーションの外観をとてもシンプルに設定することができ、現在の Qt のスタイル・色・フォントなど高度なオプションまで簡単にアクセスすることが可能です。
Qt は設定情報を全て /etc/xdg/Trolltech.conf (システム全体) や ~/.config/Trolltech.conf (ユーザー個別) に保存しています。このファイルには外観と関係ない情報が多く含まれているため見づらいですが、変更をファイルの最後に加えれば前の値を上書きできます (変更は [Qt] ヘッダーの下に追加してください)。
例えば、テーマを QtCurve に変更するには、以下を追加します:
~/.config/Trolltech.conf
... [Qt] style=QtCurve
Qt4 には次のスタイルが含まれています: CDE, Cleanlooks, GTK+, Motif, Plastique, Windows。他のスタイルは公式リポジトリや AUR からインストールできます (ほとんどのスタイルは KDE Plasma デスクトップ用に作られています):
- Breeze — Plasma Desktop 用の Breeze ビジュアルスタイルのアートワーク、スタイル、アセット。
- Oxygen — KDE Oxygen スタイル。
- QtCurve — KDE と GTK のウィジェットスタイルの設定セット。
- Phase — 機能的でありながら単調ではない、美麗でありながら散漫ではないウィジェットスタイル。
- Skulpture — KDE と Qt プログラムの GUI スタイルアドオン。ビジュアルエクスペリエンスを向上させる影とグラデーションによるクラシカルで立体的なアートワークが特徴。
- Bespin — 細かくカスタマイズできる KDE テーマ。
- http://cloudcity.sourceforge.net/frame.php || bespin-svnAUR[リンク切れ: アーカイブ: aur-mirror]
Qt5
Qt5 は使われているデスクトップ環境によって使用するスタイルを決定します:
- KDE Plasma 5 では、KDE Plasma 5 で選択されている Qt テーマが使われます。KDE 5 System Settings (systemsettings5) を使うことで設定できます。設定項目は Appearance > Application Style > Widget Style にあります。
- KDE 4 では Oxygen (利用可能な場合) または Fusion が使われます。
- Cinnamon, GNOME, MATE, LXDE, Xfce では GTK+ が使われます (QGtkStyle)。
- 他のデスクトップ環境では、Fusion が使われます。
特定のスタイルを使いたい場合、QT_STYLE_OVERRIDE 環境変数を設定します。特に、gtk テーマを使いたい場合は GTK+ に設定してください。Qt5 アプリケーションは -style フラグもサポートしており、特定のスタイルを使って Qt5 アプリケーションを起動することができます。
Qt5 には次のスタイルが含まれています: GTK+, Fusion, Windows。他のスタイルは公式リポジトリからインストールできます:
- Breeze — Plasma Desktop 用の Breeze ビジュアルスタイルのアートワーク、スタイル、アセット。
- Oxygen — KDE Oxygen スタイル。
- QtCurve — KDE と GTK のウィジェットスタイルの設定セット。
Qt4 アプリの設定をする qtconfig-qt4 のように、qt5ct を使うことで Qt5 アプリのルックアンドフィールをカスタマイズすることができます。
Qt スタイルシート
Qt アプリケーションのルックアンドフィールをカスタマイズするのにスタイルシート、シンプルな CSS ファイルを使うこともできます。スタイルシートを使えば、アプリケーションの全てのウィジェットの外観を修正できます。
他のスタイルを使ってアプリケーションを実行するには、次のように実行してください:
$ qt_application -stylesheet style.qss
Qt スタイルシートの詳細は 公式ドキュメント や チュートリアル を見て下さい。スタイルシートの例は Dolphin modification を見て下さい。
GTK+ と Qt
GTK+ と Qt のアプリケーションを使っているならば、それらの見た目が上手く調和しないことに気づくでしょう。GTK+ スタイルと Qt スタイルを調和させたい場合は Qt と GTK アプリケーションの外観の統合を読んで下さい。
KDE 以外の環境で Qt アプリを設定
Qt4 と違って、Qt5 にはフォントやアイコン、スタイルを設定するための qtconfig ユーティリティが含まれていません。代わりに、Qt5 は DE の設定を使用します。KDE や GNOME では問題なく設定が適用されますが、他のマイナーな DE や WM を使っている場合、Qt5 アプリケーションでアイコンが表示されなくなることがあります。環境変数で XDG_CURRENT_DESKTOP=KDE や XDG_CURRENT_DESKTOP=GNOME と設定して使っているデスクトップ環境を偽装し、適切なアプリケーションを使ってアイコンセットを設定することで解決できます。
もしくは、DE に依存しない Qt5 QPA の設定ユーティリティが含まれている qt5ct パッケージを使う方法もあります。パッケージをインストールしたら、qt5ct を実行してアイコンテーマを設定し、QT_QPA_PLATFORMTHEME="qt5ct" 環境変数を設定して下さい。それで Qt アプリケーションに設定が反映されます。
開発
サポートされているプラットフォーム
Qt はマイナーなプラットフォームを含めて、今日存在するほとんどのプラットフォームをサポートしており、時々移植が増えることもあります。完全なリストは Qt の Wikipedia の記事を見て下さい。
Android
Qt for Android installer を使って下さい。
ツール
以下は公式の Qt ツールです:
- Qt Creator — Qt のために作られたクロスプラットフォームの IDE で全ての機能をサポート。
- Qt Linguist — Qt アプリケーションの翻訳や国際化を素早く行うためのツールのセット。
- Qt Assistant — Qt qch ファイルの再配布可能で設定可能なドキュメントリーダー。
- Qt Designer — Qt ウィジェットのためのパワフルなクロスプラットフォームの GUI レイアウト・フォームビルダー。
- Qt Quick Designer — QML ファイルのビジュアルエディタ、WYSIWYG をサポート。Qt Quick アプリケーションを素早くデザインしてスクラッチからコンポーネントを作ることができます。
- QML Viewer — QML ドキュメントを読み込むためのツール。QML アプリケーションの開発やデバッグを容易にします。
- qmake — 様々なプラットフォームをまたがった開発プロジェクトのビルドプロセスを簡素化するのを助けるツール。cmake に似ていますが、オプションは少なめで Qt アプリケーションのために作られています。
- uic — *.ui XML ファイルを読み込み対応する C++ ファイルを生成するツール。
- rcc — ビルドプロセスの間に Qt アプリケーションにリソース (画像など) を埋め込むために使われるツール。Qt リソース (.qrc) ファイルで指定されたデータを含む C++ ソースファイルを生成します。
- moc — Qt の C++ 拡張を扱うツール (シグナルとスロット、ランタイムタイプ、ダイナミックプロパティなど)。
バインディング
Qt は人気のある言語全てにバインディングがあります。完全なリストはここを見て下さい。
以下では 'Hello world!' というメッセージを小さなウィンドウで表示するサンプルを示しています。
C++
- パッケージ:
- ウェブサイト: http://qt-project.org/
- ビルド:
- Qt4 バージョン:
g++ $(pkg-config --cflags --libs QtGui) -o hello hello.cpp - Qt5 バージョン:
g++ $(pkg-config --cflags --libs Qt5Widgets) -o hello hello.cpp
- Qt4 バージョン:
- 実行:
./hello
hello.cpp
#include <QApplication>
#include <QLabel>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QLabel hello("Hello world!");
hello.show();
return app.exec();
}
QML
- パッケージ: qt4 または qt5-declarative
- ウェブサイト: http://qt-project.org/
- 実行:
qmlviewer-qt4 hello.qmlまたはqmlscene-qt5 hello.qml
hello.qml
import QtQuick 1.0
Rectangle {
id: page
width: 400; height: 100
color: "lightgray"
Text {
id: helloText
text: "Hello world!"
anchors.horizontalCenter: page.horizontalCenter
anchors.verticalCenter: page.verticalCenter
font.pointSize: 24; font.bold: true
}
}
Python (PyQt)
- パッケージ:
- python-pyqt4 - Qt 4 の Python 3.x バインディング
- python2-pyqt4 - Qt 4 の Python 2.x バインディング
- python-pyqt5 - Qt 5 の Python 3.x バインディング
- python2-pyqt5 - Qt 5 の Python 2.x バインディング
- ウェブサイト: http://www.riverbankcomputing.co.uk/software/pyqt/intro
- 実行:
python hello-pyqt.pyまたはpython2 hello-pyqt.py
hello-pyqt.py
import sys
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
label = QtGui.QLabel("Hello world!")
label.show()
sys.exit(app.exec_())
Qt 5.x バージョンの場合、多少変わります:
hello-pyqt.py
import sys
from PyQt5 import QtWidgets
app = QtWidgets.QApplication(sys.argv)
label = QtWidgets.QLabel("Hello world!")
label.show()
sys.exit(app.exec_())
Python (PySide)
- パッケージ:
- python-pyside - Python 3.x バインディング
- python2-pyside - Python 2.x バインディング
- ウェブサイト: http://www.pyside.org/
- 実行:
python hello-pyside.pyまたはpython2 hello-pyside.py
hello-pyside.py
import sys
from PySide.QtCore import *
from PySide.QtGui import *
app = QApplication(sys.argv)
label = QLabel("Hello world!")
label.show()
sys.exit(app.exec_())
C#
- パッケージ: アーカイブ: aur-mirror
- ウェブサイト: http://techbase.kde.org/Development/Languages/Qyoto
- ビルド:
mcs -pkg:qyoto hello.cs - 実行:
mono hello.exe
hello.cs
using System;
using Qyoto;
public class Hello {
public static int Main(String[] args) {
new QApplication(args);
new QLabel("Hello world!").Show();
return QApplication.Exec();
}
}
Ruby
- パッケージ: アーカイブ: aur-mirror
- ウェブサイト: http://rubyforge.org/projects/korundum/
- 実行:
ruby hello.rb
hello.rb
require 'Qt4'
app = Qt::Application.new(ARGV)
hello = Qt::Label.new('Hello World!')
hello.show
app.exec
Java
- パッケージ: qtjambiAUR
- ウェブサイト: http://qt-jambi.org/
- ビルド:
javac Hello.java -cp /opt/qtjambi-beta/qtjambi-linux64-community-4.7.0/qtjambi-4.7.0.jar - 実行:
java -cp /opt/qtjambi-beta/qtjambi-linux64-community-4.7.0/qtjambi-4.7.0.jar:. Hello
Hello.java
import com.trolltech.qt.gui.*;
public class Hello
{
public static void main(String args[])
{
QApplication.initialize(args);
QLabel hello = new QLabel("Hello World!");
hello.show();
QApplication.exec();
}
}
Perl
- パッケージ: kdebindings-perlqt
- ウェブサイト: http://code.google.com/p/perlqt4/
- 実行:
perl hello.pl
hello.pl
use QtGui4;
my $a = Qt::Application(\@ARGV);
my $hello = Qt::Label("Hello World!", undef);
$hello->show;
exit $a->exec;
Lua
- パッケージ: libqtluaAUR
- ウェブサイト: http://www.nongnu.org/libqtlua/
- 実行:
qtlua hello.lua
hello.lua
label = qt.new_widget("QLabel")
label:setText("Hello World!")
label:show()
トラブルシューティング
アイコンテーマが適用されない
Qt 5.1 から SVG のサポートはモジュールに移動されました。qt5-base は qt5-svg を依存パッケージとしていないため、qt5-base がインストールされていても qt5-svg がインストールされていない場合があります。この場合、SVG がサポートされないためにアイコンが何もエラーを出さずにスキップされてしまい、アイコンテーマが使われなくなってしまいます。qt5-svg をインストールすることで問題は解決します。
Qt4 スタイルが反映されない
(KDE ではない) Qt4 アプリケーションが選択した Qt4 スタイルを使用しない場合、KDE のスタイル (Oxygen や Phase など) がある場所を Qt4 に教える必要があります。/etc/profile (root 権限がない場合は ~/.profile) に以下を記述して QT_PLUGIN_PATH 環境変数を設定してください:
export QT_PLUGIN_PATH=$HOME/.kde4/lib/kde4/plugins/:/usr/lib/kde4/plugins/
これで qtconfig-qt4 が KDE のスタイルを見つけられるようになり全てが上手く行くはずです。
もしくは、Qt4 の styles ディレクトリから KDE4 の styles ディレクトリにシンボリックリンクを作成します:
# ln -s /usr/lib/{kde,qt}4/plugins/styles/[theme name]