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

QtQuick.XmlListModel 2.0 でアイテムが追加された場合の処理を書く

Published: 2013-04-30 / Last modified: 2013-04-30

ちょっと古いネタですが、この間会った時 に同じことを言っていた気がしたのでブログに書いておく。

QtQuick 1.0 の XmlListModel の実装は QDeclarativeXmlListModel というクラスで行われており、モデルとしてのインターフェースは基底クラスの QListModelInterface になります。このクラスは void itemsInserted(int index, int count); というシグナルを持っており、XmlListModel のデータが増えた際にこのシグナルが発生するため、(ドキュメントに載っていないため公式な API ではありませんが) onItemInserted: というハンドラで処理を行うことができました。

QtQuick 2.0 では、XmlListModel の再実装が行われ、QQuickXmlListModel というクラスに変わりました。アイテムの追加や削除は基底クラスの QAbstractListModel のさらに基底クラスの QAbstractItemModel がインターフェースになります。

というわけで、QtQuick 2.0 の XmlListModel の要素の追加時には void rowsInserted(const QModelIndex & parent, int start, int end) シグナルが発生するため、QML でハンドラを書く場合には onRowsInserted: の中で start と end を見て処理をするようになります。

Continue reading...

QML のプロパティで配列を扱う際の注意点

Published: 2013-04-29 / Last modified: 2013-04-29

QML(Qt)でプロパティで「variant」に保存された配列などは更新できない。 で解説されているとおり、variant 型のプロパティに配列やオブジェクトを指定した場合、それを操作することはできませんでした。

Qt Quick 2.0 で導入された var 型のプロパティを使用すると、プロパティに指定した配列やオブジェクトを操作することができるようになりました。

import QtQuick 2.0

Item {
id: root
width: 360
height: 360

property var array: new Array

Row {
Text {
id: text1
width: root.width / 2
text: array.join('\n') // バインディングは動作しません!
}
Text {
id: text2
width: root.width / 2
}
}

Timer {
interval: 1000; running: true; repeat: true
onTriggered: {
array.push(Qt.formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss'))
text2.text = array.join('\n')
}
}
}

Timer をもちいて1秒ごとに array プロパティに値を追加し、array の要素を改行で接続した文字列を text2 の text に代入しています。

text1 で行っているようなプロパティバインディングは(少なくとも現時点では)動作しません。

また、「new Array」の部分を「new Object」とすることで、オブジェクト型のプロパティを作成することも可能です。

Qt 5 を 64bit Linux で動かすと文字の描画が壊れることがある

Published: 2013-04-18 / Last modified: 2013-04-21

このサンプル のスクリーンショットなのですが、「ホ」の描画が上下反転みたいな感じになっています。
タイミングによっては以下のように全体の文字がそれぞれ逆さまになったり、さらに酷いときにはもっと文字の描画がぐちゃぐちゃになったりする現象に悩まされていました。

会社で仕事で使っている 32bit の Ubuntu 12.04 では再現しないので、Gentoo でしか再現しないエラーとかめんどくさいなーと思っていたところ、64bit の Ubuntu で同じ現象が見られたので、少しやる気をだして調べることにしました。

Continue reading...

Qt 5 のビルドが通らなかった

Published: 2013-04-11 / Last modified: 2013-04-11

日本語環境の Linux 上で、3月の中旬ごろから Qt 5 の stable/dev ブランチのビルドが通らなくなっていました。

エラーが発生する場所は(おそらく最初に moc が走るところと思われる) qtbase/src/corelib/ で、以下のようなメッセージがでます。

/home/tasuku/org/qt-project/qt-5.1-alpha/build2/qtbase/bin/moc -DQT_NO_XKBCOMMON -DQT_NO_USING_NAMESPACE -DQT_BUILD_CORE_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DELF_INTERPRETER=\"/lib64/ld-linux-x86-64.so.2\" -DQT_USE_ICU -DPCRE_HAVE_CONFIG_H -DQT_CORE_LIB -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I/home/tasuku/org/qt-project/qt-5.1-alpha/qt-everywhere-opensource-src-5.1.0-alpha/qtbase/mkspecs/linux-g++-64 -I/home/tasuku/org/qt-project/qt-5.1-alpha/qt-everywhere-opensource-src-5.1.0-alpha/qtbase/src/corelib -I../../include -I../../include/QtCore -I../../include/QtCore/5.1.0 -I../../include/QtCore/5.1.0/QtCore -Iglobal -I/home/tasuku/org/qt-project/qt-5.1-alpha/qt-everywhere-opensource-src-5.1.0-alpha/qtbase/src/3rdparty/pcre -I/home/tasuku/org/qt-project/qt-5.1-alpha/qt-everywhere-opensource-src-5.1.0-alpha/qtbase/src/3rdparty/harfbuzz/src -I/home/tasuku/org/qt-project/qt-5.1-alpha/qt-everywhere-opensource-src-5.1.0-alpha/qtbase/src/3rdparty/md5 -I/home/tasuku/org/qt-project/qt-5.1-alpha/qt-everywhere-opensource-src-5.1.0-alpha/qtbase/src/3rdparty/md4 -I/home/tasuku/org/qt-project/qt-5.1-alpha/qt-everywhere-opensource-src-5.1.0-alpha/qtbase/src/3rdparty/sha3 -I.moc/debug-shared -I. -I/usr/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include-fixed -I/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4 -I/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4/x86_64-pc-linux-gnu -I/usr/local/include -IIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../x86_64-pc-linux-gnu/lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../:/lib/:/usr/lib/ -IOLLECT_GCC_OPTIONS='-m64' '-pipe' '-E' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' -IOMPILER_PATH=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.6.3/:/usr/libexec/gcc/x86_64-pc-linux-gnu/4.6.3/:/usr/libexec/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../x86_64-pc-linux-gnu/bin/ -I索リストの終わりです。 /home/tasuku/org/qt-project/qt-5.1-alpha/qt-everywhere-opensource-src-5.1.0-alpha/qtbase/src/corelib/animation/qabstractanimation.h -o .moc/debug-shared/moc_qabstractanimation.cpp
Qt Meta Object Compiler version 67 (Qt 5.1.0)
make[3]: *** [.moc/debug-shared/moc_qabstractanimation.cpp] エラー 1
make[3]: ディレクトリ `/home/tasuku/org/qt-project/qt-5.1-alpha/build2/qtbase/src/corelib' から出ます
make[2]: *** [sub-corelib-make_first] エラー 2
make[2]: ディレクトリ `/home/tasuku/org/qt-project/qt-5.1-alpha/build2/qtbase/src' から出ます
make[1]: *** [sub-src-make_first] エラー 2
make[1]: ディレクトリ `/home/tasuku/org/qt-project/qt-5.1-alpha/build2/qtbase' から出ます
make: *** [module-qtbase-make_first] エラー 2

根本的な原因は make configure set up QMAKE_DEFAULT_{INC,LIB}DIRS で行われた INCLUDE パスの捜索の自動化 が、英語環境以外を想定していないということです。ここで取得された誤ったパスが、append $$QMAKE_DEFAULT_INCDIRS to moc invocations の変更で moc の引数に渡されるようになったため、上記のようなエラーが発生するようになりました。

この問題は既にリポジトリ上では Ensure GCC prints its messages in English when we parse them というコミットで修正されていますが、Qt 5.0.2Qt 5.1.0 alpha1 でにはこの変更は含まれていないため、ソースからビルドする際にこのようなエラーが発生する場合は このパッチ を当てる必要があります。

Qt 5.1 アルファ版

Published: 2013-04-09 / Last modified: 2013-04-09

2013年4月8日、The Qt BlogQt 5.1 アルファ版のアナウンス がありました。

Qt 5.1 のアルファ版がダウンロードはこちらから

Qt 5.1 のアルファ版に関する不具合を見つけた場合には、バグレポート をよろしくお願いします。

Android & iOS

Qt 5.1 では Android と iOS のサポートが追加されました。すべての qtbase の機能(Core, Gui, Network 等)が実装され、Qt Quick は Android 上で動作するようになっています。また、センサー類にも対応しています。

Multimedia 一部機能が未実装であったり、iOS 上では Qt Quick が動作しないなど、制限事項もいくつかあります。ツール類は現在対応中で、Qt Creator から開発のすべてを行えるようにはまだなっていません。

昨年にアナウンスしたとおり、Android と iOS の正式なサポートは Qt 5.2 で行うことになりますが、Qt 5.1 を使って開発をはじめることができるようになっています。

Qt Quick Controls


やっと、Qt Quick でクロスプラットフォームのコントロールが使えるようになりました。元々 Desktop Components と呼ばれていたものが、Qt Quick Controls という名前になり、ボタンやレイアウト、メニューやツールバー、ダイアログや高レベルなナビゲーション用のコントロールなどを使用したユーザーインターフェースが簡単に作れるようになりました。

これらのコントロールは、プラットフォームに応じて最適なルックアンドフィールになるよう設計/実装されています。

現在は、デスクトップ向けの実装のみで、タッチ端末向けの実装は Qt 5.2 で追加される予定になっています。

アドオン

Qt 5.1 ではいくつかのモジュールが追加されました。アドオンとして復活した Qt Sensors は、Android、iOS、BlackBerry 及び Mer(Sailfish) に対応しています。

シリアルポートを操作するモジュール(Qt SerialPort)や、X11 限定の機能をサポートするモジュール(Qt X11Extras) も追加されました。

Qt 5 で全角文字を半角に変換する #02

Published: 2013-04-01 / Last modified: 2013-04-01

Qt 5 で全角文字を半角に変換する #01 で実験的に実装した、QString::transliterate(QString type) の設計や実装 がとてもアドホックだったので、もう少し Qt っぽい作りにしてみました。

新しいパッチは Change Ib8904c1e: WIP: add QTransliterator です。QString にメソッドを追加するのではなく、専用のクラスを作成しました。

今回のパッチには、ユニットテスト も追加してみました。

使い方は以下のようになります。

#include <QtCore/QTransliterator>
...
QTransliterator transliterator;
transliterator.setType(QStringLiteral("Halfwidth-Fullwidth"));
transliterator.transliterate(QStringLiteral("012")); // 012

作り的に QtQuick で全角文字を半角に変換する と同じになっているため、qmlRegisterType をすると QtQuick からも使えるようになります。

QtQuick で全角文字を半角に変換する

Published: 2013-03-28 / Last modified: 2013-03-28

はじめに

昨日書いた Qt 5 で全角文字を半角に変換する #01 に以下のようなフィードバックがありました。

ここでいう「プラグイン」というのは QNeptunea という Nokia N9 上で動く Twitter Client の機能を拡張するプラグインで、「苦労」とは これ とか これ の変更のことを指しています。

パッチ を見てもらえるわかるかと思いますが、実際にこの機能の実装は 20行程度 で、Qt のバージョンに依存するようなコードではないので、Qt 4 でも簡単に同じ事が実現できます。

作ったもの

ということで、QtQuick 1.x から Transliterate するような 簡単なサンプルを作ってみました 。取得の仕方などは http://qtquick.me/ の「Readonly access」を参照してください。

import QtQuick 1.1
import me.qtquick.transliterator 0.1

Text {
id: halfwidth
Transliterator {
id: transliterator
type: 'Fullwidth-Halfwidth'
}
Component.onCompleted: halfwidth.text = transliterator.transliterate('123ABC')
}

のように使うことができます。便利ですね。

Continue reading...