Atsushi4のブログスマートフォン用の表示で見るAtsushi4のブログへたれQtプログラマの備忘録的ななにかこの広告は、90日以上更新していないブログに表示しています。自分のもくもく内容です。Quickアプリケーションを自分のAndroid端末で動かしてみよう、というのが当日のターゲットでした。ここで、Androidアプリなら画面の縦横切替が欲しいなーと思ってちょっと悩んだのでその内容です。こんな感じで縦横を切り替えたい、ということです。せんせーの助言を受けつつとにかく動いたので上げておきます。GridLayoutのflowで縦横レイアウト方向が変えられるようです。ブログ用に1ファイルで書いています。あと、縦横の判定はScreen.orientationが使えるぽいですが今回はデスクトップでも動くように縦横比較にしました。jsでこのフラグの書き方が良くわかりません。Preview」で動くと思います。概要QStringLiteralやQString::fromUtf8などを使うべきところで使っていない箇所にコンパイル時warningまたはerrorを出す。Qt勉強会#38@Tokyoでそんなお話をしていたので調べてみました。結論.proファイル等でdefineを追加します。2016/09/16追記:VCコンパイラでは出ないようです。char定数配列を引数にとるimplicitなコンストラクタおよび代入演算子は提供される。defineされる模様。QT_NO_CAST_TO_ASCII推奨、というカンジでしょうか。00:13QStringとchar*との変換に警告を出すTweet広告を非表示にするコメントを書くもっと読む2016-09-10QListの全数処理を計測する概要Qt勉強会#38@Tokyoで、QListの全数処理の処理速度を比較してみました。_data関数で計測対象関数を渡すと、ケース名と計測結果をずらずらっと出力できるので思ったよりいいカンジでした。Excelで直接開けるんじゃないかと思います。やってみた方がいらしたら結果を教えて頂きたいです。テストコードこんなコードでした。Quickのマウスによる矩形範囲選択がうまくいかない、というお話を聞いてやってみた内容です。図のように、矩形の軌跡が残ってしまいます。見ると、ペン幅5pixelを指定しているのに左と上は3pixel、右と下は2pixelになっている、という問題もあります。再現コードQQuickPaintedItemを継承、QPainterで描きます。5;};mousePressで始点を保存、mouseMoveで矩形更新してpaintで描画します。penWidthを考慮してマージンを入れる必要がある(参考:QPainter::drawRecthttp://doc.qt.io/qt-5/qpainter.html#drawRect)修正というわけでmouseMoveを修正します。(3)}うまく動くようになりました。(4)とやると、等価な式に見えるのですがうまくいきません。QRectのwidthやheightがマイナスの時にマージンを足すと、想定した挙動にならないからです。margins));と書く必要があります面倒です意味わかりません何とかしtええと、幅-10にマージン20乗せたら幅10だよね、とか、今の仕様も分かるのですが、やっぱり(3)と(4)の結果が等しくないというのは違和感があります。修正したら誰か困るんかナー。今回書いた以外の実装QWidgetアプリケーションでQGraphicsViewを使う場合はview->setDragMode(QGraphicsView::RubberBandDrag);でいけると思います。他にQRubberBandというクラスもあるようですが、使ったことがないのでよくわかりません。QuickではRectangleを置いてしまう、という手もあると思います。Creatorでシンボルの名前変更中に「コピー」しようとすると「ペースト」されるという変なバグを踏みまして、勉強会の最後にお話ししたところ早速task_jpさんが直してくれました。ありがとうございます。Qiitaの20日の記事です。すごい!!超おめでとうございます!!さて、今回はQt4の始めのころから気になっていた日本語入力のバグをやっとこさ退治したのでそれにまつわるお話を。Studioでデバッグをしていました。StudioでQtアプリケーションをデバッグするための手順や、実際にやった事を書いていきたいと思います。バグの内容バグの内容はhttps://bugreports.qt.io/browse/QTBUG-49955のとおりで、こんな風にPre-Editの文字が残ってしまう、というバグです。変換候補を表示した状態で次の一文字目のキーを押した時のイベントがうまくハンドリングできていない模様。QWindowsInputContextの問題なので、QtのWidgetsおよびQMLの全ての日本語入力で起きていました。Creatorでは何故かその後ろにテキストカーソルが固定されて、どこを編集しているのか分からなくなるという事態も。2013を使用しました。キーボードの入力イベントを追いかけたいので、ブレイクポイントは使えません(フォーカスがVSに移って別のイベントが出てしまうので)。qDebugを埋め込むという手も有るけど、デバッグ出力の内容を変えるたびに再ビルドしないといけなくなります。それなら(最近やっと覚えた)トレースポイントの出番です。GDBでも使えるらしいけどIDEから操作できないし。環境構築とりあえずこれだけ必要だと思います。括弧内は私が実際に使用した環境です。opensource)ターゲットはQWindowsInputContext(5.5/Src/qtbase/src/plugins/platforms/windows/qwindows.vcxroj内)なのでqtbaseだけビルドできればOKとしました。StudioAdd-inの使えるものが良いです。Add-inが入れられないとQStringの中身とか見るのが大変で泣けます。最近はCommunityが使えるので嬉しいです。Add-inVSで.proファイルを開いたり、QStringやQListの中身を見やすく表示したり、といった機能を提供してくれるらしいです*1。Downloadsに有ります。http://www.qt.io/download-open-source/#section-7QtのソースコードソースコードをダウンロードしてきてConfigureしてビルドすれば良いのですが、色々苦い思い出があるのでインストーラが入れてくれた環境を使おうと思い、5.5をインストール(srcのインストールを追加選択)した環境を使おうと思いました。結果的にはQt5.5の32bit版をインストールして、5.5/msvc2013/libディレクトリを5.5/Src/qtbase/libにコピーして何とかなりました。始めは64bitをインストールしたのですがプロジェクト設定は32bitになっていて64bitのLIBやDLLを参照にいっちゃったりしてしっちゃかめっちゃか。面倒くさいのでやりなおし。Src/qtbase/libに入っていないqtfreetyped.libとかが無い、といってリンクエラーになります。プロジェクトの出力先が5.5/msvc2013/のbinとかlibになっているのに参照先は5.5/Src/qtbase/libになっていました。デバッグとりあえずqwindowsinputcontext.cppのあちこちの関数にトレースポイント貼りまくって、呼ばれる関数や参考になりそうな変数を探しました。それからトレースポイントに条件設定したりして絞り込みました。トレースポイントはプログラムを実行しながら付けたり消したり、一時的に無効にしたり、出力内容を変更したりできるのでこういう時には本当に便利だと思います。頻繁に使う場合はTools-Option-Environment-KeyboardでEditorContextMenus.CodeWindow.Breakpoint.InsertTracepointに適当にキーを割り当てましょう。呼び出し元関数を出力したり、書式指定でdefine名を表示したりできるのは今回初めて知りました。参考にさせて頂いたブログズミさんに感謝。Creatorのお世話になる事が多いですが、バグを追いかける時はVSを使う事が多いです。Studioはいかがでしょうか。ちなみにこのバグのパッチは私がpushするbranchを間違えたため5.6には間に合わず5.7でマージされる事になるようですごめんなさいごめんなさいごめんなさい。すくせんせーのおかげで、5.6にマージされました。お楽しみに!*1:今回の環境ではVSに「Qt」メニューが追加されないのでどこから.proファイルを開けばいいのか分かりませんでした。Qiitaの19日目のエントリーです。タイトルのとおり、QWidgetベースのアプリケーションでプロパティバインディングできたらいいな、という事で、やってみた内容を書いていきます。ちなみに元々の動機は、なんかメンテナンス性を上げるためにMVVMで作れ!とかなんとかそんな圧力とかなんとかそんな感じです。あと、QMetaType周りってちょっと便利そうだけどあんまり使い方が分からないので使ってみたいとかそんな欲求もありました。実際にやってみたとにかくやってみました。何とか動くところまではいった、というところでしょうか。SignalとSlotのQMetaMethodを探してなんとかするとりあえずSignalとSlotをQMetaObjectのMethodから探して何とかしようと思いました。meta2->method(meta2->indexOfMethod(signature.toLatin1())));}とりあえずこれで一方のプロパティの変更を他方のプロパティに反映することができるようになりました。以下の制限があります。二つのプロパティの型が同一であることfrom側の変更通知シグナルがあることto側にset[プロパティ名]という名前のset用SlotがあることQtのクラスは大体3番目の条件を満たしているので、ViewModelのプロパティの型を合わせてnotifySignalを定義すればそれなりに使えそうな気がします。別のクラスで受ける上の方法ではちょっと制限がきついので、もう少し考えてみました。meta->method(meta->indexOfMethod("checkChanged()")));}これならfrom側にnotifySignalがあってto側のpropertyがwritableならbindできます。型も同一でなくてもQVariantベースで変換できれば変換してくれます。シグナルが関数ポインタで取れればラムダでちょちょいっと書けそうなのですが、それらしきAPIは見つかりませんでした。あとはちゃんと専用クラスに分離して、途中でdeleteされるクラスの始末とかエラー処理とか入れればそれなりに使える・・・かも?おわりにQMetaObjectとか使うとconnectよりも柔軟にpropertyの接続とかできるかもしれません。大量のコントロールのobjectNameをproperty名に合わせておいて全部まとめてset、getするとか(そもそもそれは設計が悪いとか言わない)。Adventarの15日目のエントリーです。Twitterさんによるモックのお話でした。今日はインターフェースクラスと抽象クラスについてのお話です。東海地区大会2日目のモデリングワークショップにおいて、本部審査委員長の渡辺博之さんがとても分かりやすく説明してくださったので共有したいと思って書いています。ご指摘、質問歓迎します。抽象クラス、インターフェースクラスとはさっそく説明を見ていきます。動物を抽象化した抽象クラス「動物」と車を抽象化した「車」クラスがあるとして、どちらも「走る」という振舞いを持っているとすると、この「走る」という振舞いをインターフェースクラスとして抜き出せるかもしれないね、というお話でした。クラス図を書くと下のようになります。渡辺さんの説明はここまでです。抽象クラスとは抽象クラスとは、上の「動物」クラスや「車」クラスのように、共通の性質を持つクラス群を抽象化したクラスです。抽象クラスの特徴は次のとおりです。抽象クラスのインスタンスを生成することはできない。インターフェースクラスとはインターフェースクラスとは、上の「走るインターフェース」クラスのように、通常異なる性質を持つ複数のクラス間において、共通する振舞いのインターフェースを規定するクラスです。インターフェースクラスの特徴は次のとおりです。インターフェースクラスのインスタンスを生成することはできない。インターフェースクラスは実装を持たない。C++の実装から見た抽象クラスとインターフェースクラスC++ではそれぞれのクラスがどのように実装されるのか見ていきます。抽象クラスの実装例は次のとおりです。run();};C++の実装における抽象クラスの特徴は次のとおりです。抽象クラスのコンストラクタはprotectedにする。virtualにする。)のいずれも持つことができる。インターフェースクラスの実装例インターフェースクラスの実装例は次のとおりです。0;};C++の(望ましい)実装におけるインターフェースクラスの特徴は次のとおりです。publicな純粋仮想関数(なるべく1つ)のみを持つ。virtualにする。*1デストラクタの実装は上の方に書いた「インターフェースクラスは実装を持たない」に反しますが、C++では派生クラスのメンバーをリークさせないために必要ですね。動物クラスと車クラスの例では、全てのインスタンスを走らせるために2つのリストをtemplateを使って走査しなければならないかもしれません。doRun<Car>);}インターフェースクラスを使うと、1つのリストで扱えます。doRun);}インターフェースクラスを使うと振舞いのインターフェースを厳密に決めることができ、戻り値の違いやデフォルト引数などによる関数のシグネチャの違いが無い事を保障することができます。templateを使った例では、runを関数ポインタのpublicメンバー変数にするようなトリッキーなこともできちゃいます。(そっちの方が柔軟だ、という人もいるかもしれませんが)おわりに抽象クラスとインターフェースクラスについて書きました。ETロボコンのモデリングにおいて、「動物」や「車」(あるいは「銀行」:P)のような、モノを抽象化したクラスに<interface>と書いたら、「あれ、設計がおかしいかもしれない」と見直してみると良いかもしれません。ちなみにうちのチームのモデルシートは<interface>の人が集約の全体クラスになったりしていてあばばばばば。2回続けて記事の公開が翌日になってしまいましたごめんなさい。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。