小澤です。 いつもお世話になっております。
Qtサンプルの中にある、quicknanobrowserについて質問があります。
quickwindow.qmlに定義されている、
property Item currentWebView : tabs.getTab(tabs.currentIndex).item
となっています。getTabの戻り値であるItemは、TabViewの上にある
WebEngineViewのことだと思いますが、あってますか?
それとも、WebViewとの継承関係があるのでしょうか?
また、ヘルプの見方が分かってないのですが、
TabView.getTabの戻り値はItemだと思うのですが、なぜわざわざ
TabView.getTab(??).itemとするのでしょうか?キャストみたいなもの
でしょうか?
最後に、ソースコード上では、
WebEngineView = Item
のように振る舞っていますが、本来のItemはWebEngineViewとは別の
オブジェクトだと思いますが、なぜ上記の代入が成立するのでしょうか?
QMLを本格的に始めようとしていますが、いきなり躓いてしまい途方に暮れて
います。
以上、よろしくお願い致します。
たすくです。
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/8c6f087296ec48790c3efd9564c10... で、TabView::addTab(...) にて追加したものです。 http://doc.qt.io/qt-5/qml-qtquick-controls-tabview.html#addTab-method
addTab の実装は https://qt.gitorious.org/qt/qtquickcontrols/source/5fbad0e976b4b603e2f4faccb... を見てみると、 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/54e05945b0ec4328b9d56b3b6a988...
property Item currentWebView の型を WebEngineView に変更するパッチを送るとか、 WebEngineView の基底クラスに Item って書いていないんだけど、というバグ報告をして直してもらうと よりわかりやすくなると思います。
QMLを本格的に始めようとしていますが、いきなり躓いてしまい途方に暮れて います。
「Qt QuickではじめるクロスプラットフォームUIプログラミング」という書籍の 「6.8 エレメントの動的読み込み」の章に今回の Loader や Component.createObject の説明が書いてありますので、 こちらを読むことをおすすめします。
またいおりさんが書いた「Qt Quickを使いこなすクロスプラットフォームUIプログラミング」にて QtQuick Controls の使用のしかたが色々網羅されていますので、こちらも合わせて読んで、自分で色々作ってみるといいと思います。
たすく様
早速、お返事いただきありがとうございます。 本件、理解しました。
「Qt QuickではじめるクロスプラットフォームUIプログラミング」 本書は買いました。参考箇所を読み直してみます。
ヘルプに書かれていない件は、バグ報告をしようと思います。 初めてのことですが、やってみます。
以上
2015年1月5日 16:26 Tasuku Suzuki stasuku@gmail.com:
たすくです。
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/8c6f087296ec48790c3efd9564c10... で、TabView::addTab(...) にて追加したものです。 http://doc.qt.io/qt-5/qml-qtquick-controls-tabview.html#addTab-method
addTab の実装は
https://qt.gitorious.org/qt/qtquickcontrols/source/5fbad0e976b4b603e2f4faccb... を見てみると、 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/54e05945b0ec4328b9d56b3b6a988...
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 mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users