2019年8月24日(土) に開催された Qt 勉強会 @ Nagoya #30.1 - connpass へ参加しました。
そのまとめです。
自己紹介
毎回の通り、自己紹介と本日やることを宣言。
初めて参加の方が一人いた。
@kazuo_asa さんによる発表
@kazuo_asa による
- Yoctoを使用して、Boot2Qtをraspberry pi用に構築してみよう。
- Qt Creatorを使用して、raspberry piで動作するQtアプリのリモートデバックの仕方。
の発表がありました。
発表資料: Raspberry Pi 3 で Qt 5 をビルドして動かす方法(Yocto layer Boot2Qt編)
自分の本日のやること
- 前回の続きの動画からフレームを切り出し動画のメタ情報とフレーム位置に応じた時刻を設定するツールを実装
前回までの状況
- フレームの取得の高速化(フレーム数で取得するのを諦めフレーム数とフレームレートで秒数を求めて指定するようにした)
- なぜかフレームデータの受け渡しでアクセス違反が... なぜだ!?
本日の知見
void* → QVariant
たぶんこう。
```c++ Hoge* hogePointer = this->getHoge(); QVariant a = QVariant::fromValue(reinterpret_cast<void*>(hogePointer));
ただ、なんか逆がうまくいかないので Q_DECLARE_METATYPE で型を登録して利用するようにした。
### QVariant で自作のクラスのポインタを扱う
QVariant で自作のクラスのポインタを扱うための実装。
定義
このとき、一部だけで `Q_DECLARE_METATYPE` を使うと `static_assert failed "Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system"` とエラーが出る。
```c++
// hoge.hpp
#include <QObject>
class Hoge {
// ...
};
Q_DECLARE_METATYPE(Hoge*)
利用方法
#include <hoge.hpp>
void fuga() {
// to QVariant()
Hoge* hoge1 = new Hoge();
QVariant a = QVariant::fromValue(hoge1);
// from QVariant()
Hoge* hoge2 = a.value<Hoge*>();
}
QQmlEngine:QMLエンジンとは異なるスレッドにあるクラスへの不正な接続試行
QQmlEngine: Illegal attempt to connect to XXXXXXX(0x99999999) that is in a different thread than the QML engine QQmlApplicationEngine(0x99999999.
というエラーが出た。
どうやら QQmlApplicationEngine
とは別のスレッドで作成したインスタンスにアクセスしようとすると出るっぽい。
本日の進捗
なぜかアクセス違反で落ちると思ってたらそもそも想定した値が入ってなかった(つまるところ未初期化) それは落ちるわけだ... とりあえずこれは直った。
やっとサムネイルが出るようになった。
画面はこんな感じで行きたいな。
とりあえずの成果はこんな感じ
メモ
- UIどうするか?
- 最終的にはスマホでも動くようにしたいなぁ
- 複数の動画をドロップして全部一度に選べると良さそう