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

Qt 勉強会 #12 @Tokyo 開催しました

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

2014年6月21日(土曜日)に Qt 勉強会 #12 @Tokyo株式会社 PTP さんのミーティングルームで開催しました。

Qt Developer Day Tokyo 2014 が大変盛り上がって以来の今回の勉強会ですが、参加者の数も普段と変わらず、いままでどおりの楽しい勉強会となりました。

今回のおやつ

Qt おやつ部の部員などが持ち寄ったお菓子を食べながら各自もくもくと Qt の勉強をしたりなにかを作ったりしていました。

簡単な自己紹介

今回は初めて参加された方が2名、学生さんが1名という感じでした。参加登録されて来られなかった方も2名いらっしゃいました。

もくもく

自己紹介の後は自由(自習?)タイムということで、自分のやりたいことを進めながら、誰かが質問したり、なんかの発表があったりという形で進めていきました。

Qt Quick の紹介

Qt をはじめたばかりで何から手をつけたらいいですか?という方がいらっしゃったので、Qt Developer Day Tokyo 2014 で行われた「Qt Quick の紹介」のセッションの内容を スライド(.pdf)サンプルコード(.zip) を見ながら、朝木さんに簡単にもう一度話をしてもらいました。

Qt Contributors summit 2014 の紹介

2014/6/10,11 にドイツのベルリンで開催された Qt Contributors Summit 略して QtCS の簡単な紹介をしました。

オープニングセッションの動画が公開されているので、それを見ながら簡単にどんな話がここでなされたのかを紹介しました。

後半の Qt のフラグメンテーションを解消する話がとてもワクワクする内容だったので、お暇な方は是非見てみてください。

QtCS の各セッションの議論の内容は QtCS 2014 Program にまとまっているので、今後の Qt に興味のある方はご覧ください。

Qt for iOS と QML Compiler

朝木さんに Qt for iOS のシミュレーターでのデモと、QML Compiler を試してみた話をしてもらいました。

QML Compiler は現在は有償版でのみ提供されているようですが、こういうものはちゃんとオープンソース化してみんなで開発して、みんなで使えるようにしてもらいたいものですね。

その他

初めて参加された方も、毎回参加している人も、初心者の方も、長年 Qt を使っている人も、それぞれ楽しく Qt の勉強をしていました。

Continue reading...

とりあえず 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...