Qt 勉強会 @ Tokyo #64 参加報告 | Qt製WebブラウザーFalkonのソースコード調査

概要

イベント情報
項目 内容
イベント名 Qt 勉強会 @ Tokyo #64
URL https://qt-users.connpass.com/event/103835/
ハッシュタグ #qtjp
主催者 日本Qtユーザー会
開催地 東京都新宿区新宿1-23-1 新宿マルネビル9F
開催日時 2018- 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のインストール方法は別の記事にして,リンクを後日こちらに記載する。

Falkonの起動画面は以下のとおりだ。

Falkonの起動直後
タブ追加ボタンの位置
Falkonの画面

シンプルなUIとなっている。特徴的なのはタブバーの右端に存在するタブ追加ボタンはマウスホバーしない限り,存在がわからないことだ。FirefoxやChromiumだと,右端に「+」ボタンがあったので,これらと異なるので驚いた。

タブ追加ボタンの配置をどのように実装しているかを,残りの時間でFalkonのソースコードを調査した。

src/lib/app/browserwindow.cpp (BrowserWindowクラス)」がブラウザー画面のルートクラスのようだ。その他,以下のソースコードが関係ありそうだった。

TabWidgetクラスのm_buttonAddTabメンバー変数がタブ追加ボタンのようで,これはAddTabButtonクラスで生成されている。

タブ追加ボタンの配置で重要そうな役割を担っているのが,TabBar::tabSizeHint() だ。この関数で,タブボタンの配置を調整したり,関数の最後にemit tabBar->moveAddTabButton(xForAddTabButton);を発信して,タブ追加ボタンを移動させている。

このtabSizeHintは以下の流れでよばれているようだ。

  1. TabBarHelper::tabSizeHint
  2. (ComboTabBar) m_comboTabBar->tabSizeHint
  3. (TabBarHelper) localTabBar(index)->baseClassTabSizeHint()
  4. TabBar::tabSizeHint()
  5. ComboTabBar::tabSizeHint(index)

ただし,この最初のTabBarHelper::tabSizeHintがどのタイミングでどこからよばれるのかわからなかった。

QTabBarのマニュアルを見る限り,タブサイズを計算するのにこの関数を再実装する必要があるらしい。しかし,調べても情報がなく,それ以外よくわからなかった。

The following virtual functions may need to be reimplemented in order
to tailor the look and feel or store extra data with each tab:

Detailed Description | QTabBar Class | Qt Widgets 5.11

以下のQ&Aでもタブ追加ボタンの実装について質問があり,その回答でsizeHintを再実装していた。

qt – How can I add a “new tab” button next to the tabs of a QMdiArea in tabbed view mode? – Stack Overflow

内部で勝手にタブサイズに使っているのかもしれない。Qtのソースコードを追いかけないと,正確なことがわからない。

結局今回の勉強会ではここまでだった。

結論

なかなか作業が先に進まなくてもどかしい。一度確立できればそれっきりなのだけれど。

勉強と思って,次回はQtのソースコードをダウンロードしてきて,tabSizeHintが呼ばれるタイミングどうなっているのか,何か手がかりがないか調べてみようかと思う。

もしだめだったら,Q&Aにあったとおり,適当にtabSizeHintを再実装するなりして,うまくいかないかみてみる。

いや,現状タブ追加ボタンで問題になるのはドラッグで移動できてしまうことなので,タブ追加ボタンがドラッグ中にどうやって移動できないようにしているのかを調べる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です