日記

ただの日記

Qtについて調べる

ElectronもいいけどQtもいい。

Qtを始めようとするとまず、Qtがなんなのかよくわからなくなる。

プログラムだけで動かしているようなサンプルもあるしQMLとかいう謎の言語を使っているものもある。それにQt QuickとかQt Widgetとかよくわからない!開発環境であるQt Creatorを入れてみても、DesignerとかAssistantとかいろいろインストールされて何が何だか…

といわけでQtについて調べてみる。

Qtの概要

Qt(http://qt.io/)とは、クロスプラットフォームのアプリケーション開発環境のことである。デスクトップだけではなく組込系やスマートフォン向けのアプリケーションも作成できる。

デスクトップ 組み込み モバイル
Linux, Windows, MacOS VxWorks, QNX, Android,iOS,BlackBerry,Sailfilsh OS

QtアプリケーションはC++によって開発する。ただしQt特有の機能を実現するためにMOC(Meta Object Compiler)によってプリコンパイルしてC++コンパイラコンパイルする。純粋なC++にちょっと文法を追加したものということかな。

Qtのライセンス

Qtには有料版と無料版があり、それぞれでライセンスが異なる。 ライセンスがGPLなのかLGPLなのかはライブラリによって違うみたい。

例えばhttps://www.qt.io/licensing-comparison/ を見るとQt ChartsとQt Data VisualizationはLGPLでは使用できないようである。

ざっと見たところ特殊なモジュールは使いそうにないのでLGPLでいこう。

- オープンソース 商用版
ライセンス形態 LGPL version3 もしくはGPL version3 クローズドソースで開発・配布可能
価格 無料 $79~

公式サイト

以下のサイトにGPL, LGPLの詳細が書いていた

Qtの開発環境

開発環境にはQt CreatorというIDEが用意されている(Linux, Win, Macで動作)。 Qt Creatorをインストールすると、Qt Designer, Qt Assistant,Qt Linguistがインストールされる。

Qt DesignerはQt Widgets向けにUIを作成し、Qt Assistantはヘルプで、Qt Linguistは多言語対応するためのツールみたい。

開発環境はQt Creatorであるが、内部でビルドツールであるqmakeが使われている。qmakeについてもクロスプラットフォームで動く。

Windowsでインストールした場合はPATHも通っていてcmdからqmakeでビルドができるようだ。ネットでソースだけ書かれていたのは、qmakeを直接叩いてビルドしたのだろうと結論付けた。つまり気にしないと。

Qt WidgetsとQt Quick

Qtで新しいプロジェクトを作ろうとするとQtウィジェットアプリケーションとQt Quick アプリケーションを選択できる。それぞれの違いはなんだろうか?

これら2つはUIの作成方法に違いがある。

Qt Widgets

Qt WidgetsはC++からWidgetsモジュールを呼び出してUIを設計する方法である。時系列的にはこっちが先。コードでいちいち作成するのが面倒であるのでQt Designerによって直感的にUIを作成することができるのもQt Widgetsである。

C++で作るならJavaのSwingとかみたいにButtonのオブジェクトを作って レイアウトのメンバに値を入れてビューに追加みたいなちょっと面倒な操作。

でも、そこはDesignerでuiを作成して読み込ませればいいので問題にはならない。

Qt Quick

Qt QuickはそのままだがQt Quickというモジュールを使ってUIを設計する方法である。このQt QuickはQML(Qt Meta-Object Language)という言語でUIを記述する。

こちらも同様にGUI上の操作で簡単にUIを作れる。この場合はQt DesignerではなくQt Creator上で設計を行う。ということはQt Quickを使うならQt Creatorだけで事足りるみたいだ。

QMLはオブジェクト記述言語と呼ばれ、ボタンなどをオブジェクトとして宣言するように記述する。また、ボタンクリック時の動作も記述することができる。この場合JavaScriptで記述することができる。百聞は一見にしかずでソースを見ると直感的にわかる。

RowLayout {
    Button {
        text: "Ok"
        onClicked: model.submit()
    }
}

React.jsのコンポーネントみたい。UIのレイアウトと動作をかけるので基本的にQMLでアプリケーションを作れるのだが、複雑な処理をする場合はC++で記述してQMLとC++の連携が必要になる。

どちらがいいのだろう。

開発していないのでわからないが、Qt Quickのほうが簡単につくれるみたい。 だからQt Quickを使うことにする。2つの言語で書くので言語間の連携をどのように行うかが不安。

その他

QtはGUIだけでなくネットワークやXMLJSONの解析ライブラリなども搭載されている。QMLでもC++でも利用できる。

ドキュメントはここ https://doc.qt.io/qt-5/qtmodules.html

また、C++以外の言語で開発するためのバインディングが存在している。 RubyやらPythonやらJavaが使えるみたいだけどこの場合テキストエディタで開発することになるのだろうか…?

情報元はここ https://wiki.qt.io/Category:LanguageBindings

参考