在使用 qt widgets 時,經常要實現一些比較炫酷的效果(例如:滑動、翻頁),這時選擇 qml 會顯得非常簡單。
那麼,問題來了:
將 qml 與 qt widgets 相結合
建立了乙個簡單的 qml 檔案,用於顯示乙個綠色的矩形,其中包含乙個文字。為了說明 qml 與 qt widgets 的互動,在矩形中新增了兩個訊號。
如果需要,可以將像往常一樣使用 qmlscene 來執行。import qtquick 2.1
rectangle
mousearea
// 訊號處理程式(處理從 qt widgets 接收到的訊號)
oncsignal:
}
要載入和顯示 qml,可以使用以下兩種方式:
無論使用哪種方式,一旦主原始檔的 url 被指定,都將自動載入和顯示 qml 檢視。
注意:在 qml執行環境 中,還介紹了另一種方式 -qqmlengine + qqmlcomponent
,但是這種方式不能以 view 的形式載入。
qquickwidget 是 qt 5.3 中提供的乙個類,繼承自 qwidget,它是 qquickwindow 乙個很方便的包裝器,用於顯示 qt quick 使用者介面。
使用方式:
qquickview 是 qt 5.0 中提供的乙個類,繼承自 qquickwindow(繼承自 qwindow),用於顯示 qt quick 使用者介面。qquickwidget *view =
new qquickwidget;
view->setsource(qurl::fromlocalfile("myqmlfile.qml"));
view->show();
使用方式:
可以看到,兩者的使用方式幾乎沒什麼區別。但是,qquickwidget 基於 qwidget,而 qquickview 基於 qwindow,所以需要將其轉換為 qwidget,才能與 qt widgets 相結合。qquickview *view =
new qquickview;
view->setsource(qurl::fromlocalfile("myqmlfile.qml"));
view->show();
這樣,就需要再引入乙個函式:
[static] qwidget *qwidget::createwindowcontainer(qwindow *window, qwidget *parent = q_nullptr, qt::windowflags flags = qt::windowflags())該函式用於建立乙個 qwidget,可以將 window 嵌入到基於 qwidget 的應用程式中。
所以,要將 qquickview 轉為 qwidget,可以使用下述方式:
當一切準備就緒,就可以將 qml 與 qt widgets 完美結合在一起了:qquickview *view =
new qquickview();
qwidget *widget = qwidget::createwindowcontainer(view, this);
view->setsource(qurl("qrc:/main.qml"));
最終效果:
原始碼如下:
結合之後,少不了通訊,這裡採用訊號槽的方式,通過 qml 的根元素 root 來傳送和接收訊號。#include
"widget.h"
#include
#include
#include
widget::widget(qwidget *
parent)
: qwidget(parent)
}void widget::receivefromqml()
QML嵌入Qt Widgets及訊號槽的連線
最近在學習qml,想把qml嵌入到qwidgets中,用來實現一些動畫。本文參考知名博主一去 二三里的文章 將 qml 與 qt widgets 相結合 本程式實現 單擊qml頁面,更新按鈕的文字 單擊按鈕,更新qml頁面的顏色 訊號處理程式 處理從 qt widgets 接收到的訊號 oncsig...
玩轉Qml 5 Qml與C 互動
qml訪問c qml已經有很多功能,不過終歸會有不夠用或不適用的地方,需要通過與c 的互動進行功能擴充套件。這回濤哥嘗試把所有qml與c 互動相關的知識點都寫出來,做乙個透徹 全面的總結。玩轉qml 系列文章,配套了乙個優秀的開源專案 taoquick github 訪問不了或者速度太慢,可以用國內...
QML小例子 QML工程裡訊號與槽
1 效果 功能 點選左邊,會發出訊號,右邊會有個顏色動畫,然後計數 1 2 分析 一共有兩個物件,他們很多屬性都差不多,如可變顏色 原型 可變text.所以可以宣告乙個circle物件,然後sender和recver都繼承它 能夠通過sender控制recver,那麼sender一定有訊號發出,然後...