[Qt-users:407] Re: QMLサンプルソースについての質問

Tasuku Suzuki stasuku @ gmail.com
2015年 1月 5日 (月) 16:26:40 JST


たすくです。


2015年1月5日 10:55 小澤和広 <kazuhiro.ozawa @ gmail.com>:
> 小澤です。
> いつもお世話になっております。
>
> Qtサンプルの中にある、quicknanobrowserについて質問があります。
>
> quickwindow.qmlに定義されている、
>
> property Item currentWebView : tabs.getTab(tabs.currentIndex).item
>
> となっています。getTabの戻り値であるItemは、TabViewの上にある
>
> WebEngineViewのことだと思いますが、あってますか?
> それとも、WebViewとの継承関係があるのでしょうか?

TabView の getTab() ですが
http://doc.qt.io/qt-5/qml-qtquick-controls-tabview.html#getTab-method
には「Returns the Tab item at index.」と書いてあるので、Tab エレメントのインスタンスが返ってきます。
http://doc.qt.io/qt-5/qml-qtquick-controls-tab.html

その Tab エレメントは
https://qt.gitorious.org/qt/qtwebengine/source/8c6f087296ec48790c3efd9564c1056802b4c9c0:examples/webengine/quicknanobrowser/quickwindow.qml#L165
で、TabView::addTab(...) にて追加したものです。
http://doc.qt.io/qt-5/qml-qtquick-controls-tabview.html#addTab-method

addTab の実装は
https://qt.gitorious.org/qt/qtquickcontrols/source/5fbad0e976b4b603e2f4faccbcb5c052d917ba7a:src/controls/TabView.qml#L115
を見てみると、
tabcomp という Component をロードして Tab エレメントを作成し、
そのエレメントの sourceComponent に addTab で渡された component を設定しています。

Tab エレメントは Loader エレメントを継承していて component の実体化は Loader の機能になります。
http://doc.qt.io/qt-5/qml-qtquick-loader.html

Loader で生成したアイテムは item プロパティで参照することができます。
http://doc.qt.io/qt-5/qml-qtquick-loader.html#item-prop
なので、
tabs.getTab(tabs.currentIndex)
は Tab が、
tabs.getTab(tabs.currentIndex).item
は tabComponent を Tab (の基底エレメントの Loader) で実体化した WebEngineView が入っている形になります。


> また、ヘルプの見方が分かってないのですが、
>
> TabView.getTabの戻り値はItemだと思うのですが、なぜわざわざ
>
> TabView.getTab(??).itemとするのでしょうか?キャストみたいなもの
>
> でしょうか?

前述のとおり、getTab の戻り値が Tab で、Tab は Loader を継承しているので .item を使用します。


> 最後に、ソースコード上では、
>
>  WebEngineView = Item
>
> のように振る舞っていますが、本来のItemはWebEngineViewとは別の
>
> オブジェクトだと思いますが、なぜ上記の代入が成立するのでしょうか?

http://doc.qt.io/qt-5/qml-qtwebengine-webengineview.html
を見ると WebEngineView は基底クラスの記載がありませんが、
QtQuick 側で見えている WebEngineView の実装である QQuickWebEngineView は
QtQuick 的には Item である QQuickItem を継承しているため Item として扱うことができています。
https://qt.gitorious.org/qt/qtwebengine/source/54e05945b0ec4328b9d56b3b6a9886fc24ad3e6a:src/webengine/api/qquickwebengineview_p.h#L51

property Item currentWebView の型を WebEngineView に変更するパッチを送るとか、
WebEngineView の基底クラスに Item って書いていないんだけど、というバグ報告をして直してもらうと
よりわかりやすくなると思います。


> QMLを本格的に始めようとしていますが、いきなり躓いてしまい途方に暮れて
> います。

「Qt QuickではじめるクロスプラットフォームUIプログラミング」という書籍の
「6.8 エレメントの動的読み込み」の章に今回の Loader や Component.createObject の説明が書いてありますので、
こちらを読むことをおすすめします。

またいおりさんが書いた「Qt Quickを使いこなすクロスプラットフォームUIプログラミング」にて
QtQuick Controls の使用のしかたが色々網羅されていますので、こちらも合わせて読んで、自分で色々作ってみるといいと思います。

http://relog.xii.jp/mt5r/2014/08/qt-quick-3.html


Qt-users メーリングリストの案内