Qt 5 の未来は明るいブログ

とりあえず QtQuick 2.0 だけ動けばいい Qt 5 の環境構築方法

Published: 2014-06-19 / Last modified: 2015-05-04

何回も忘れるのでメモ。

$ git clone git://git.qt-users.jp/mirror/qt/qt5.git
$ cd qt5
$ ./init-repository --module-subset=qtbase,qtdeclarative,qtgraphicaleffects,qtimageformats,qtx11extras
$ cd ..
$ mkdir build
$ cd $_
$ ../qt5/configure -opensource -confirm-license -prefix /opt/qt/ -make libs -no-widgets -no-glib

Qt の C++ から QML の id を取得する方法

Published: 2014-06-14

QString QQmlContext::nameForObject(QObject *object) const を使うことで QML の id を取得することができます。

ちなみに QObject::property("id") では残念ながら取得できません。

サンプルコードはこんな感じになります。

#include <QtQml>

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);

QQmlEngine engine;
QQmlComponent component(&engine);
component.setData("import QtQml 2.2\nQtObject { id: test }", QUrl());
QObject *object = component.create();
qDebug() << object->property("id");
QQmlContext *context = qmlContext(object);
qDebug() << context->nameForObject(object);

return 0;
}


Continue reading...

コマンドライン引数を扱う方法

Published: 2014-06-13

Qt 5.2 で QCommandLineParserQCommandLineOption というクラスが追加され、コマンドライン引数の扱いが大幅に簡単になりました。

シンプルな使い方

sl コマンドのオプションに倣って -a, -l, -F と -h/--help を解析してみます。

#include <QtCore/QCoreApplication>
#include <QtCore/QCommandLineParser>
#include <QtCore/QDebug>

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
app.setApplicationName(QStringLiteral("sl - correct miss typing"));

QCommandLineParser parser;
parser.setApplicationDescription(QStringLiteral("sl is a highly developed animation program, which corrects your miss typing."));
parser.addHelpOption();

QCommandLineOption accidents(QStringLiteral("a"), QStringLiteral("It seems some accidents have happened. People give sad cries."));
parser.addOption(accidents);

QCommandLineOption smaller(QStringLiteral("l"), QStringLiteral("Becomes smaller."));
parser.addOption(smaller);

QCommandLineOption fly(QStringLiteral("F"), QStringLiteral("Flies."));
parser.addOption(fly);

parser.process(app);

if (parser.isSet(accidents)) {
qDebug() << "Help!";
}
if (parser.isSet(smaller)) {
qDebug() << "smaller";
}
if (parser.isSet(fly)) {
qDebug() << "I can fly!";
}

return 0;
}

Continue reading...

Qt の C++ から QML の function を実行する方法

Published: 2014-06-12

QML 内に記述された JavaScript の function を C++ から呼び出してみたいと思ったことはありませんか?ありませんか?

というわけで(以前に試してみてたしかダメだったのですが、Qt 5.2 から JavaScript の実行エンジンが変わったことによって、ひょっとして今ならできるかも?と思って再度)試してみました。

exec-function-in-qml-from-cpp.pro

TEMPLATE = app
TARGET = exec-function-in-qml-from-cpp
QT = qml

SOURCES = main.cpp

RESOURCES = main.qrc

シンプルなコンソールアプリで QML の実験をするための最小構成になっています。

main.qml

import QtQml 2.2

QtObject {
id: root
function echo(msg) {
console.debug(msg)
return msg
}
}

これが今回使用する QML ファイルで、この echo 関数を C++ から実行します。

Continue reading...

QtQuick の Singleton 機能の使い方

Published: 2014-06-12 / Last modified: 2014-06-12

enum 使いたいとかクラスメソッドみたいなのを使いたいとか色々要望があった QtQuick ですが、Qt 5.2 あたりで Singleton 対応がなされたようなので試してみました。

  1. Singleton にする .qml ファイルの上の方に
    pragma Singleton
    と書く。
  2. qmldir ファイルを作成し、
    singleton MySingleton MySingleton.qml
    と書く。
  3. 使用する qml ファイルで qmldir のあるディレクトリを明示的に import する。
    import '.'

参照:int qmlRegisterSingletonType(const QUrl & url, const char * uri, int versionMajor, int versionMinor, const char * qmlName)

それでは、QtQuick のソースツリーに含まれる Singleton 関係のテストコード を見ながら使い方を探っていきましょう。

singletonTest1.qml

import QtQuick 2.0
import "singleton"

Item {
property int value1: SingletonType.testProp1;
property string value2: "Test value: " + SingletonType.testProp3;
}

singleton ディレクトリ を import しています。このディレクトリに含まれる SingletonType というエレメントが Singleton になっており、メンバ変数に SingletonType.testProp1SingletonType.testProp3 のような記述でアクセスしています。

singleton/qmldir は以下のようになっていて、ここで SingletonType エレメントを Singleton として使用できるようにしています。

singleton SingletonType SingletonType.qml

singleton/SingletonType.qml はファイルの先頭部に pragma Singleton と記述してあります。

import QtQuick 2.0
pragma Singleton

Item {
id: singletonId

property int testProp1: 125
property int testProp2: 25
property int testProp3: -55
width: 25; height: 25

Rectangle {
id: rectangle
border.color: "white"
anchors.fill: parent
}
}

Continue reading...

Qt のブランチ構成が変わりました

Published: 2014-06-07 / Last modified: 2014-06-07

Qt の開発者のメーリングリスト[Development] [HEADS UP] new branching scheme: 5.3 branches created, stable deprecated という投稿があり、Qt の開発のブランチ構成に変更がなされました。

これまで Qt は dev(マイナーアップデート用、新機能の追加)、stable(パッチアップデート用、バグ修正)、release(リリース用) という3つのブランチ構成で開発が進められてきましたが、今後は dev(マイナーアップデート用、新機能の追加)、5.x(パッチアップデート用、バグ修正)、5.x.y(リリース用) のような構成になりました。

これは、今年の2月に Qt のリリース用のメーリングリスト で行われた CI やリリースの都合で dev/stable/release の採用以前のスキームに戻したい という議論の結果になります。

というわけで、これまで stable ブランチで作業していた人は 5.3 ブランチを使うようにしましょう

パッチの送り先については、すでに refs/for/stable にプッシュ済みのパッチはそのまま作業を続け、新たなバグの修正は refs/for/5.3 にプッシュしてください。

[QTBUG-38463] Qt Quick のバグを直してもらいました。

Published: 2014-06-05 / Last modified: 2015-07-16

The id Attribute - QML Object Attributes | QtQml 5.3

Every QML object type has exactly one id attribute. This attribute is provided by the language itself, and cannot be redefined or overridden by any QML object type. A value may be assigned to the id attribute of an object instance to allow that object to be identified and referred to by other objects. This id must begin with a lower-case letter or an underscore, and cannot contain characters other than letters, numbers and underscores.

(訳)QML の id 属性は言語として提供されている属性で、他の型で再定義できません。各オブジェクトの id に設定された値はそのオブジェクトを特定し、他の場所から参照するために使われます。アルファベットの小文字かアンダースコアではじまって、アルファベットと数字とアンダースコアで構成されている必要があります。

というわけで、QML では id プロパティは言語仕様として特別扱いになっているのですが、Qt 5.1 までは動作していた以下のような QML が、Qt 5.2 で行われた JavaScript エンジンの刷新に伴って(?)動かなくなった(警告で落ちる)ので修正してもらいました。

import QtQml 2.0

QtObject {
id: root
property int id
}

とりあえずバグを報告

自分で直せるかどうかぱっと見よく分からなかったので、とりあえずバグレポートを書いておきました。[#QTBUG-38463] QML Crash when an element has "property int id"

タイトルも説明もシンプルですけど、これだけの情報でこのバグの再現は可能なので問題はないでしょう。

バグを修正してもらえた

Change I0da58557: Fix crash (failing assertion) when declaring a non-string id property というパッチを QML のメンテナの人が作ってくれて、Lars のレビューを経てマージされました。

This isn't very useful QML, but the following was "legal" in 5.1:

とか言われたので、そんなことないんだーとコメントしておきました。

というわけで、(リグレッションかつクラッシュなのでシステム的にはプライオリティ高いんでしょうけど、)こんなほんとどうでもいいバグでも直してもらえたので、みなさんバグを見つけたらちゃんと報告して直してもらいましょう。

この修正は今月リリース予定の Qt 5.3.1 に含まれる予定です。

Qt Developer Day Tokyo 2014 の写真が公開されました

Published: 2014-05-30

Google+ の 2014 Qt Developer Day Japan で写真が公開されました。

当日の大盛況ぶりや、Qt ユーザー会の奮闘ぶり?が伺える写真がたくさん公開されています。是非ご覧ください。

ついでに、

というリクエストがあったので Digia の人にお願いして

QIODevice の API で FIFO をお手軽に実現する

Published: 2014-05-22 / Last modified: 2014-05-22

Qt で低レベルなデータの読み書きをする場合、QFileQTcpSocket など QIODevice の派生クラスを使う事が多いですよね。

read, write, pos, size, bytesAvailable, readyRead と、QIODevice の API はとても便利なのですが、残念ながらこの API で FIFO 的に動作するクラスは Qt にはありません。

これは、QIODevice::pos() などの API が読み書き両方に(別々に/同時に)対応するのが難しいからだと推測されます。

というわけで、基本的には難しいのですが、QByteArray をバッファとする QBuffer というクラスを少し工夫して使うことでこれを実現する方法を思いついたのでメモしておきます。

Continue reading...

Qt Developer Day Tokyo 2014 に参加しました(後編)

Published: 2014-05-21 / Last modified: 2014-05-30

2014年5月20日に秋葉原で開催された Qt Developer Day Tokyo 2014 に参加してきました。

色々書いていたらながーい記事になったので 前編中編後編 に分けました。後編はキーノートと参加したセッションなどについてです。

技術の壁を打ち破る:現代のアプリケーション開発の最前線にある Qt

Tommi Laitinen - インターナショナルプロダクツ上級副社長, Digia, Qt

Qt とはなにか、Qt の目指しているところ、Digia に移行してからの実績などを紹介し、Digia はとても Qt を頑張っているというアピールをしていました。

それから、イベント前日の リリースのオンラインミーティング で「明日の朝にリリースでいいね?」というで話がまとまっていた、Qt 5.3 のリリース のアナウンスもありました。

Qt Developer Day Tokyo が、毎年秋にヨーロッパとアメリカで開催している Qt Developer Days と同じような位置づけになったようで、ちょっとうれしかったです。

内容的には 昨年秋の Qt Developer Days で行われたキーノート とそんなに違わない気がするので、これを見て復習するとよいかもしれません。

Qt のあゆみ:我々の今とテクノロジーの向かう先

Lars Knoll - Qt CTO および Qt Project チーフメンテナ, Digia, Qt

Qt の歴史、現在、将来の話をしました。ノルウェー人の2人が最初に Qt を作りはじめた時の話、Trolltech 時代と Nokia 時代を経て Digia になってからの成果などがうまくまとまっていました。Qt の方向性と、それを実現するために Qt 5.2、Qt 5.3 と開発を進めてきたこと、今秋リリースされる Qt 5.4 に向けた開発の内容や、1年後の Qt 5.5 はまだまっさらな状態だということなど、ちょっと早口でしたが、わかりやすいスピーチでした。

こちらも昨年秋の Qt Developer Days で行われたキーノートの 動画が公開されている ので、興味のある方はご覧ください。

日本市場におけるQtの拡がり

山口 大介 シニアマネージャー、株式会社SRA

SRA はがんばってます!っていう話でした。

QtはあなたのInternet of Thingsにつながるデバイスの戦略を後押しします

お昼

お弁当を食べながら LT 大会をやっていたらあっという間でした。

モバイルにも対応したQtによるクロスプラットフォーム戦略

大穴のトレーニングセッションに挑戦してみたら、大敗しました。

というわけで、Qt 5.3 のリリース記事 をまとめてみたり、

6月の Qt 勉強会 @ Tokyo の募集を開始してみたり、

1ヶ月くらい直そう直そうと思っていた Qt のバグを修正してアップストリームにパッチを投げてみたり

と色々頑張りました。

ネイティブ開発と Web 技術との融合

Lars Knoll - Qt CTO および Qt Project チーフメンテナ, Digia, Qt

トレーニングを抜け出して、Lars の本日なんと3つ目となるセッションを聞きに行ってきました。

KHTML から WebKit そして Blink ベースの QtWebEngine に移り変わっていく話はとても面白かったです。

まとめ

GWで仕事を休みにくい5月の、ESEC の直後の平日に有料でイベントをやると聞いたときにはこれはヤバい…と思いましたが、なんと予想を上回る250人以上の来場者があり、無料のイベントで、コーヒーもランチも3時のおやつも提供され、双方向の同時通訳も付いて、とても良かったと思いました。

キーノートが多いとか、スライドの字が小さいとか、プレゼンが練習不足でいまいち満足出来なかったとか、夢の中に旅立ってしまえるようなトレーニングセッションだったりという声もささやかれていましたが、来年に期待しましょう。

Qt Developer Day Tokyo 2014 を機に、日本でももっともっと Qt の採用実績やユーザー数が増えて、幸せになれる開発者の数が増えるといいなぁと思っています。

というわけで、オープンソースとしての Qt だけではなく、有料版の Qt も是非ご検討ください。Qt に興味がわきました!とか Qt 使い始めます!という方は Qt ユーザー会:メーリングリスト に参加していただけると、各地でも勉強会のアナウンスが流れてくると思いますし、もし質問とかがあれば聞いてみるとコミュニティのメンバーから回答が得られるかもしれません。

それから、Qt はオープンソースのプロジェクトなので、バグを見つけた場合には是非 バグレポート にご協力ください。また、Qt のバグを自分で直したって人は Qt のコードレビュー のシステムを通じて Qt 自体にマージする手続きをお願いします。

いまの Qt は、いくつかの大きな企業による投資だけではなく、たくさんのボランティアの人の貢献によって成り立っている素晴らしいプロジェクトです。日本からの貢献の数も年々少しずつ増えていますが、世界的に見るとまだまだ「日本人って Qt 使ってるの?」って感じなので、一人一人が少しずつ貢献して、大きな貢献にできたらいいなぁと思っています。