Qt あれこれ

久方ぶりに Qt を触っているんだが、Qt 自体は進化している。

日本の Qt 事情

なのだが、日本の Qt 事情はお寒い。

まず、日本語で書かれたオリジナルの Qt 関係の本はほぼない。

唯一あるとすれば、これ↓。

まあ入門書でしょう。→ 括りとしては入門書なのでしょうが、細部に著者の Qt に対する洞察が散りばめられており、ここら辺は入門書の範疇を超えています。

レビューにもあるように

なお、表紙、裏表紙、背表紙すべてにあるロリ絵はやめて欲しいです。 恥ずかしい事この上ありません。 なぜ技術本にロリ絵を付けないといけないのかさっぱりわかりません。

ロリ絵というかアニメ絵というか。

頭のあたりに注目するとウマ娘意識してんのかな?と思わないでもない。

装丁は、まあ、賛否分かれるでしょう。

確かに Qt6 になって、Qt Creator の操作性はけっこう変わっている。

QML

一昔前の Qt GUI というと Qt Widget だったが、QML もかなり成長しているようだ。

この記事でも、将来は QML だろう、みたいなことが書かれている。

確かに、これはそうだよなあ。

Web アプリの作り方は、ほぼ大筋が固まっている。バックエンドとフロントエンド、UI とロジックの分離などなど。

このおかげで何をどうやって作成するのかという目標が持ちやすい。

おまけにブラウザの表現力は年々上がってきているし。

比較するのもアレだが Java の GUI 環境なんて今では陳腐に見える。

デスクトップもこの感覚で作りたい、というのは、当然の流れのように思える。

Qt5 → Qt6 何が変わったか?

vector の(内部的な)取り扱いが変わった。

上の本でも触れられているが、

#include <QCoreApplication>

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

    QVector vector;
    vector << 1 << 2;
    qDebug() << vector;


    return a.exec();
}

を走らせると QVector(1, 2) ではなくて

QList(1, 2)

と表示される。
要するに Qt5 時代の List を Vector にした模様。

 

Qt の ORM QxOrmを使ってみる

Qt の Orm である QxOrm を使ってみたくなったので、MacOS にインストールを試みた。

あらかじめ言っておきますが、試みただけで、(動くことは動いたが)完全にうまくいったというわけではないので念の為。

この手のややマイナーなソフトはメンテなどが手薄な感は否めない。

トライアル1

手順は QxOrm の公式ページで案内されている。

案内は windows のみなので、Mac の場合は適宜読み換える。

1 まず、Qt をインストール。

ここは問題ないでしょう。ただし、Qt5 で説明しているが、現在(2023/1月頃)の最新版は 6.2.4 である。
後で説明すると思うが、Qt6 では、このバージョン(1.4.8)はビルドできないことがわかっている。

2 qmake がコマンドラインから使えるように  PATH を修正。

今後のことを考えるとここはやっておいた方がいいでしょう

3, 4 boost の lib_shared を使えるようにしておく(optional)

ただし、boost は必須ではない。開発者も言っているが、ビルドできるかもわからない段階で無理してこの機能を試す必要性は薄い。

5 QxOrm 本体のダウンロード

ダウンロードページはこちら。これを書いている時点でのバージョンは 1.4.8 。

6 boost を使う場合は、QxOrm の QxOrm.pri を適宜編集

上で触れたように、ここは飛ばしましょう。

7 QXORM_DIR を環境変数に加える。

ここはやっておきましょう。

この後、8, 9, 10 とサンプルを試す手順が説明されているのだが、当たり前だが、QxOrm のライブラリ自体が構築されていないのでリンカエラーが出る。

というわけで、ライブラリを構築する。。。のだが、ここでエラー。

打開策

GitHub にいくと、Unable compile QxOrm1.4.8 というド直球な issue が立っている。

開発側は

I can build QxOrm and all examples without any issue with Qt 6.2.3, so I think it should be OK with Qt 6.2.4 (if you download latest version on GitHub, which should be : QxOrm_1.4.9_BETA_18)

と、1.4.9 を使えと言っている。

しかし、有償のライセンス(無償と有償のダブルライセンス)もあるのに、これはいかんのでは?と思わないでもない。

トライアル2

というわけで、GitHub から 1.4.9 を落としてきて、ビルド。

 

今度は、ビルド成功。

添付のサンプルを動かしたみた限りでは動作も問題なさそう。

wt::dbo vs odb vs QxOrm

ところで、C++ の ORM は定番というものがない。

QxOrm, odb, wt::dbo あたりがそこそこは知られているのだが、wt::dto の作者さんがユーザーさんの質問に答える形で3者の相違について語ってます。(→ 記事

 

Qt

最近、すっかりご無沙汰の Qt。

睡魔と戦いながら、boost と Qt をインストール。

経験ある人ならわかると思うが、両者のインストール時間は極めて長い。

薄れいく意識の中、操作をしていたので、起きたら、どこに Qt をインストールしたのかわからなくなったw

デフォルトだとホーム直下に Qt というフォルダがつくられ、その中に Qt Creator がある。

ライセンス

わかりにくいと評判の Qt で作成したアプリのライセンス。

ええと、これ、Qt でスタティックライブラリでアプリを作るのでなければ、LGPL っすよね。

Qt で作成した部分に関しては、公開の義務なし。

「スタティックライブラリでなければ」と書いたが、公式にもスタティックのライブラリ群は提供されておらず、意識的に(かなり苦労して)スタティックライブラリでアプリを構築する以外はダイナミックリンクで作成せざるを得ない。

実質、LGPL っすよね。

なんであんなわかりにくい書き方するんだろ?

サンプル

なんやかんやで環境は整ったので、サンプルを実行。

M1/M2 Mac でも普通に 3D が描画できているのはエラい。

基本事項のおさらい

IDE は Qt Creator だが、ビルドシステムで qmake を選んだ場合は qmake で ****.pro を走らせている。

実際にはもうちょっと複雑なビルドシステムになっている。

なお ****.pri は PRojectInclude ファイルの略。

Qt6 からは、ビルドに cmake を選べるようになった。この場合は、当然、CMakeLists.txt を使っている。

試しにこちらのオプションでハロワしたが、いや、ほんと、普通の cmake プロジェクト。

 

 

 

 

C++ ORM

C++ の ORM を物色中。

bun

ソースコード:GitHub

メモ:boost と SOCI というのが必要。

bun 自体は Mac で動かすには修正が必要。それよか SOCI はなかなか良いプロジェクト。

 

Objective-C 再入門 -1.0.3-

今回は @autoreleasepool の話。

と言っても、私はこれに関して大して詳しくない。

オートリリースプールの使い方と基本』という素晴らしくよくまとまった記事があるので、そちらを参照してください。

オートリリースプールは通常、裏で自動的に生成・破棄されているので、基本的には意識しないで autorelease が利用できるようになっています。

ただし、無造作に独立して動いている訳ではないので、処理を長くキープし続けるような場面では、意図的にオートリリースプールを解放してあげないと、解放待ちのインスタンスでメモリが溢れてしまう危険性があります。

という解説の後に、以下のようなサンプルコードが提示されている。


// 長いループの中でオートリリースプールを生成することで、解放待ちのインスタンスが溜まってしまうのを防ぎます。
while (!isCancelled)
{
 @autoreleasepool
 {
   // この中で生成された autorelease なインスタンスは…
   self.label.text = [NSString stringWithFormat:@"Step: %d", self.step];
 }
 // 次のループ処理に入る前に release されます。
}

Xcode で Objective-C のプロジェクトを生成されると、もれなく

と @autoreleasepool{} がついてくるが、なるほど、こういう理屈だったわけですか。