# Qt (日本語)

関連記事

- KDE
- Qt と GTK アプリケーションの外観の統一
- GTK+

Qt はクロスプラットフォームのアプリケーション・ウィジェットツールキットです。標準の C++ を使っていますが言語機能を強化するために特別なコードジェネレータ (Meta Object Compiler もしくは moc) とマクロをフルに活用しています。主な特徴として:

- 主要なデスクトッププラットフォームと複数のモバイルプラットフォームで動作します。
- 完全な国際化サポート。
- SQL データベースのアクセス、XML のパース、スレッド管理、ネットワークのサポートを提供するライブラリと、ファイルを処理するための統一されたクロスプラットフォームのアプリケーションプログラミングインタフェース (API)。

Qt フレームワークは主要な開発プラットフォームの一つとして、KDE ソフトウェアコミュニティや VLC, VirtualBox, Opera, Mathematica, Skype, Maya などオープンソース・プロプライエタリ問わず様々なアプリケーションで使われています。

## インストール

現在公式リポジトリでは3つのバージョンの Qt が利用可能です。以下のパッケージでインストールできます:

- Qt 5.x は qt5-base パッケージでインストールできます。ドキュメントは qt5-doc パッケージに入っています。
- Qt 4.x は qt4 パッケージでインストールできます。ドキュメントは qt4-doc パッケージに入っています。
- Qt 3.x は qt3 パッケージでインストールできます。ドキュメントは qt3-doc パッケージに入っています。

Warning: Qt のパッケージは /usr/bin にバイナリ (例: qmake) を提供しません。代わりに -qt5, -qt4, -qt3 のシンボリックリンクが提供されます (例: qmake-qt5, qmake-qt4, qmake-qt3)。このため Qt3/4 のアプリケーションではコンパイルが失敗するかもしれません。在来のバイナリをインストールするには、次のセクションの qtchooser を見て下さい。

## デフォルトの Qt ツールキット

qtchooser をインストールすることで /usr/bin に在来のバイナリ (例: qmake) を復活させて使用する Qt ツールキットを設定できます。デフォルトでは Qt5 が使われます。

### 環境変数を使う

例えば、Qt4 に設定するには `~/.{bash,zsh}_profile` で `QT_SELECT=4` を export してください。

### 設定ファイルを使う

例えば、Qt4 に設定するには `/etc/xdg/qtchooser/4.conf` から `~/.config/qtchooser/default.conf` にシンボリックリンクを張って下さい。

## 外観

### 設定

Qt のアプリケーションは動作しているデスクトップ環境の挙動を模倣しようとします、ただし、なにか問題が発生したり、設定がハードコードされている場合は別です。Qt アプリケーションのルックアンドフィールを変更したい場合は、Qt 設定 (`qtconfig-qt4` もしくは `qt3config`) ツールが使えます。QtConfig を使うことで Qt アプリケーションの外観をとてもシンプルに設定することができ、現在の Qt のスタイル・色・フォントなど高度なオプションまで簡単にアクセスすることが可能です。Qt5 では QtConfig は削除されました。Qt5 で特定のスタイルを使うようにしたいときは、`QT_STYLE_OVERRIDE` 環境変数を使いたいスタイルに設定してください (例: `gtk`)。

Qt の中には含まれていませんが、KDE システム設定も Qt アプリケーションの多くのカスタマイズオプションを設定することができます。

#### テーマ

GTK+ スタイル、Windows スタイル、CDE スタイルなど Qt には始めから複数のスタイルが含まれていますが、公式リポジトリや AUR からさらに多くのスタイルをインストールできます (ほとんどは KDE デスクトップ用のテーマです):

- Oxygen — KDE デスクトップのデスクトップテーマ。

  http://www.oxygen-icons.org/ || kdebase-runtime

- QtCurve — GTK+ と Qt アプリケーションをサポートしている人気のデスクトップテーマ、細かい設定が可能。

  http://kde-look.org/content/show.php?content=40492 || qtcurve

- Skulpture — KDE と Qt プログラムの GUI スタイルアドオン。ビジュアルエクスペリエンスを向上させる影とグラデーションによるクラシカルで立体的なアートワークが特徴。

  http://kde-look.org/content/show.php/?content=59031 || skulpture

- Polymer — KDE Plastik Style の Qt3 移植。

  http://kde-look.org/content/show.php?content=21748 || polymer

- Bespin — 細かくカスタマイズできる KDE テーマ。

  http://cloudcity.sourceforge.net/frame.php || bespin-svn

#### フォント

Qt のフォントは QtConfig から フォント > デフォルトのフォント で設定できます。

#### アイコン

QtConfig からアイコンテーマを設定する方法はありませんが、Qt は Freedesktop.org Icon Specification に従っているので、X 用に設定したテーマセットは Qt でも使われます。

### 手動設定

Qt は設定情報を全て `~/.config/Trolltech.conf` に保存しています。このファイルには外観と関係ない情報が多く含まれているため見づらいですが、変更をファイルの最後に加えれば前の値を上書きできます (変更は `[Qt]` ヘッダーの下に追加してください)。

例えば、テーマを QtCurve に変更するには、以下を追加します:

    ~/.config/Trolltech.conf

    ...
    [Qt]
    style=QtCurve

### Qt スタイルシート

Qt アプリケーションのルックアンドフィールをカスタマイズするのにスタイルシート、シンプルな CSS ファイルを使うこともできます。スタイルシートを使えば、アプリケーションの全てのウィジェットの外観を修正できます。

他のスタイルを使ってアプリケーションを実行するには、次のように実行してください:

    $ qt_application --stylesheet style.qss

Qt スタイルシートの詳細は 公式ドキュメント や チュートリアル を見て下さい。スタイルシートの例は Dolphin modification を見て下さい。

### GTK+ と Qt

GTK+ と Qt のアプリケーションを使っているならば、それらの見た目が上手く調和しないことに気づくでしょう。GTK+ スタイルと Qt スタイルを調和させたい場合は Uniform Look for Qt and GTK Applications (日本語) を読んで下さい。

## 開発

### サポートされているプラットフォーム

Qt はマイナーなプラットフォームを含めて、今日存在するほとんどのプラットフォームをサポートしており、時々移植が増えることもあります。完全なリストは Qt の Wikipedia の記事を見て下さい。

### ツール

以下は公式の Qt ツールです:

- Qt Creator — Qt のために作られたクロスプラットフォームの IDE で全ての機能をサポート。

  http://qt-project.org/doc/qtcreator/ || qtcreator

- Qt Linguist — Qt アプリケーションの翻訳や国際化を素早く行うためのツールのセット。

  http://qt-project.org/doc/qt-4.8/linguist-manual.html || qt4

- Qt Assistant — Qt qch ファイルの再配布可能で設定可能なドキュメントリーダー。

  http://qt-project.org/doc/qt-4.8/assistant-manual.html || qt4

- Qt Designer — Qt ウィジェットのためのパワフルなクロスプラットフォームの GUI レイアウト・フォームビルダー。

  http://qt-project.org/doc/qt-4.8/designer-manual.html || qt4

- Qt Quick Designer — QML ファイルのビジュアルエディタ、WYSIWYG をサポート。Qt Quick アプリケーションを素早くデザインしてスクラッチからコンポーネントを作ることができます。

  http://qt-project.org/doc/qtcreator-2.8/creator-using-qt-quick-designer.html || qtcreator

- QML Viewer — QML ドキュメントを読み込むためのツール。QML アプリケーションの開発やデバッグを容易にします。

  http://qt-project.org/doc/qt-4.8/qmlviewer.html || qt4

- qmake — 様々なプラットフォームをまたがった開発プロジェクトのビルドプロセスを簡素化するのを助けるツール。cmake に似ていますが、オプションは少なめで Qt アプリケーションのために作られています。

  https://qt-project.org/doc/qt-4.8/qmake-manual.html || qt4

- uic — *.ui XML ファイルを読み込み対応する C++ ファイルを生成するツール。

  http://qt-project.org/doc/qt-4.8/uic.html || qt4

- rcc — ビルドプロセスの間に Qt アプリケーションにリソース (画像など) を埋め込むために使われるツール。Qt リソース (.qrc) ファイルで指定されたデータを含む C++ ソースファイルを生成します。

  http://qt-project.org/doc/qt-4.8/rcc.html || qt4

- moc — Qt の C++ 拡張を扱うツール (シグナルとスロット、ランタイムタイプ、ダイナミックプロパティなど)。

  http://doc.qt.digia.com/4.7-snapshot/moc.html || qt4

### バインディング

Qt は人気のある言語全てにバインディングがあります。完全なリストはここを見て下さい。

以下では 'Hello world!' というメッセージを小さなウィンドウで表示するサンプルを示しています。

#### C++

- パッケージ: qt4
- ウェブサイト: http://qt-project.org/
- ビルド: `g++ $(pkg-config --cflags --libs QtCore QtGui) -o hello hello.cpp`
- 実行: `./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
- ウェブサイト: http://qt-project.org/
- 実行: `qmlviewer 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

- パッケージ:
  - python-pyqt4 - Python 3.x バインディング
  - python2-pyqt4 - Python 2.x バインディング
- ウェブサイト: http://www.riverbankcomputing.co.uk/software/pyqt/intro
- 実行: `python hello-pyqt.py` or `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_())

- パッケージ:
  - python-pyside - Python 3.x バインディング
  - python2-pyside - Python 2.x バインディング
- ウェブサイト: http://www.pyside.org/
- 実行: `python hello-pyside.py` or `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#

- パッケージ: kdebindings-qyoto
- ウェブサイト: 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

- パッケージ: kdebindings-qtruby
- ウェブサイト: 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

- パッケージ: qtjambi
- ウェブサイト: http://qt-jambi.org/

    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

- パッケージ: libqtlua
- ウェブサイト: http://www.nongnu.org/libqtlua/
- 実行: `qtlua hello.lua`

    hello.lua

    label = qt.new_widget("QLabel")

    label:setText("Hello World!")
    label:show()

Note: QtLua is not designed to develop an application in pure Lua but rather to extend a Qt C++ application using Lua as scripting language.

## 参照

- 公式ウェブサイト
- Qt Project
- Qt ドキュメント
- Planet Qt
- Qt アプリケーション

Category:

- Widget Toolkits (日本語)