Qt 勉強会 @ Tokyo #64 参加報告 | Qt製WebブラウザーFalkonのソースコード調査
概要
項目 | 内容 |
---|---|
イベント名 | Qt 勉強会 @ Tokyo #64 |
URL | https://qt-users.connpass.com/event/103835/ |
ハッシュタグ | #qtjp |
主催者 | 日本Qtユーザー会 |
開催地 | 東京都新宿区新宿1-23-1 新宿マルネビル9F |
開催日時 | 2018-10-20 Sat 13:00~18:00 |
参加人数 | 10 |
SNS | https://social.senooken.jp/conversation/749168 |
今回の勉強会も名古屋と同じ開催日だった。常連ばかりだったため,自己紹介もなく,たんたんともくもく作業するだけの静かな勉強会だった。
作業
ここ2-3か月ほど継続して取り組んでいる,QtでのタブページUIの実装に今回も取り組んだ。前回の作業で,QTabWidgetでタブページUIの大部分を実装できた。しかし,タブ追加ボタンの配置の実装が課題となった。そこで,今回はタブ追加ボタンの実装に焦点を当てて作業した。
タブ追加ボタンの配置の実装方法として,3の方法を挙げた。そのうち,今回はQt製のWebブラウザーであるFalkonの実装を調査して,参考にすることにした。
まず,手始めにFalkonのリポジトリーをローカルに持ってきて,ソースコードをビルドして,実行できるようにした。ソースコードからビルドすることで,ソースコードの変更点と実際のアプリケーションの対応をみることができるので,実装を把握するうえでは重要なステップだ。
依存関係のインストールも必要だったので,結局2時間くらいかけてビルドに成功した。Falkonのインストール方法は別の記事にして,リンクを後日こちらに記載する。
2018-11-24追記: Falkonのインストール方法を「https://senooken.jp/post/2018/11/30/」に記した。
Falkonの起動画面は以下のとおりだ。
シンプルなUIとなっている。特徴的なのはタブバーの右端に存在するタブ追加ボタンはマウスホバーしない限り,存在がわからないことだ。FirefoxやChromiumだと,右端に「+」ボタンがあったので,これらと異なるので驚いた。
タブ追加ボタンの配置をどのように実装しているかを,残りの時間でFalkonのソースコードを調査した。
「src/lib/app/browserwindow.cpp (BrowserWindowクラス)」がブラウザー画面のルートクラスのようだ。その他,以下のソースコードが関係ありそうだった。
TabWidgetクラスのm_buttonAddTabメンバー変数がタブ追加ボタンのようで,これはAddTabButtonクラスで生成されている。
タブ追加ボタンの配置で重要そうな役割を担っているのが,TabBar::tabSizeHint() だ。この関数で,タブボタンの配置を調整したり,関数の最後にemit tabBar->moveAddTabButton(xForAddTabButton);
を発信して,タブ追加ボタンを移動させている。
このtabSizeHintは以下の流れでよばれているようだ。
- TabBarHelper::tabSizeHint
- (ComboTabBar) m_comboTabBar->tabSizeHint
- (TabBarHelper) localTabBar(index)->baseClassTabSizeHint()
- TabBar::tabSizeHint()
- ComboTabBar::tabSizeHint(index)
ただし,この最初のTabBarHelper::tabSizeHint
がどのタイミングでどこからよばれるのかわからなかった。
QTabBarのマニュアルを見る限り,タブサイズを計算するのにこの関数を再実装する必要があるらしい。しかし,調べても情報がなく,それ以外よくわからなかった。
以下のQ&Aでもタブ追加ボタンの実装について質問があり,その回答でsizeHintを再実装していた。
内部で勝手にタブサイズに使っているのかもしれない。Qtのソースコードを追いかけないと,正確なことがわからない。
結局今回の勉強会ではここまでだった。
結論
なかなか作業が先に進まなくてもどかしい。一度確立できればそれっきりなのだけれど。
勉強と思って,次回はQtのソースコードをダウンロードしてきて,tabSizeHintが呼ばれるタイミングどうなっているのか,何か手がかりがないか調べてみようかと思う。
もしだめだったら,Q&Aにあったとおり,適当にtabSizeHintを再実装するなりして,うまくいかないかみてみる。
いや,現状タブ追加ボタンで問題になるのはドラッグで移動できてしまうことなので,タブ追加ボタンがドラッグ中にどうやって移動できないようにしているのかを調べる。