当前位置:   article > 正文

QWidget中嵌入QML_vs 2017 qwidget项目引入qml

vs 2017 qwidget项目引入qml

近年来,QMl被Qt官方夸得天花乱坠,作为一枚传统的Qter,习惯了用QWidget,毋容置疑的是qml做出来的页面确实炫酷,那么如何在传统的qwidget中嵌入qml呢?倒腾了一上午,终于摸清了他的套路

qt版本:5.12

1.首先创建一个传统的QApplication 应用程序

application

2.添加新文件选择QMLFILE

chose

3.编写qml
 

  1. import QtQuick 2.0
  2. Item {
  3. signal signal2Widget
  4. signal signal2qml
  5. Rectangle{
  6. id:root
  7. color:"green"
  8. width: 200
  9. height: 200
  10. Text {
  11. id: mytext
  12. anchors.bottom: parent
  13. text:CppData.getCurrentDateTime()
  14. }
  15. Connections{
  16. target: CppData
  17. onRefshTime:{
  18. mytext.text = CppData.getCurrentDateTime()
  19. }
  20. }
  21. Rectangle{
  22. id:sub
  23. color: "red"
  24. width: 100
  25. height: 100
  26. anchors.centerIn: root
  27. Text {
  28. id: subtext
  29. font.pointSize: 11
  30. anchors.centerIn: parent
  31. text: qsTr(str)
  32. }
  33. MouseArea{
  34. anchors.fill:parent
  35. onClicked: signal2qml()
  36. }
  37. }
  38. }
  39. }

两个独立的矩形框,一个id为root,它的Text CppData.getCurrentDateTime()是有cpp传过来的,还有Connections连接了一个refshTime()的信号,信号触发时执行oNRefshTime函数,也就是他的text会更新。

一个id为sub,点击时会触发signal2qml()信号,等会我们在widget里面接收这个信号;

4.编写cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QtQuick/QQuickView>
  4. #include <QtQml/QQmlContext>
  5. MainWindow::MainWindow(QWidget *parent) :
  6. QMainWindow(parent),
  7. ui(new Ui::MainWindow)
  8. {
  9. ui->setupUi(this);
  10. m_pButton = new QPushButton("click",this);
  11. QQuickView *view = new QQuickView;
  12. view->rootContext()->setContextProperty("CppData",&d);
  13. QString str = "mainwindow str";
  14. view->rootContext()->setContextProperty("str",str);
  15. QWidget *widget = QWidget::createWindowContainer(view,this);
  16. view->setResizeMode(QQuickView::SizeRootObjectToView);
  17. view->setSource(QUrl("/root/2020/qtProject/yumo/QmlFile.qml"));
  18. //view->show();
  19. widget->resize(200,200);
  20. widget->move(70,60);
  21. //widget and qml communication
  22. QObject *pRoot = static_cast<QObject*>(view->rootObject());
  23. if(pRoot != nullptr)
  24. {
  25. connect(pRoot,SIGNAL(signal2qml()),this,SLOT(resiveFromQml()));
  26. //connect(m_pButton,SIGNAL(clicked(bool)),pRoot,SIGNAL(signal2qml()));
  27. }
  28. m_timer = new QTimer(this);
  29. connect(m_timer,&QTimer::timeout,this,&MainWindow::updateTime);
  30. m_timer->start(500);
  31. }
  32. MainWindow::~MainWindow()
  33. {
  34. delete ui;
  35. }
  36. void MainWindow::resiveFromQml()
  37. {
  38. m_pButton->setText("change form qml");
  39. qDebug()<<"signal from qml";
  40. }
  41. void MainWindow::updateTime()
  42. {
  43. emit d.refshTime();
  44. }
  45. QDateTime MainWindow::getCurrentDateTime() const
  46. {
  47. return QDateTime::currentDateTime();
  48. }

可以使用 QQuickView加载 QML 文档。QQmlComponent 将 QML 文档加载为一个 C++ 对象,然后可以从 C++ 代码中修改该对象。QQuickView 也做到了这一点,但由于 QQuickView 是一个基于 QWindow 的派生类,加载的对象也将被渲染至可视化显示,QQuickView 通常用于将一个可视化的 QML 对象集成到应用程序的用户界面中。QQuickView可以通过QWidget::createWindowContainer(QQuickView *,parent);的方式转换城QWidget;

QQuickView 可以通过rootContext()->setContextProperty("CppData",&d);函数将对象和名称绑定,然后在qml里面可以通过名称访问该对象;

  1. QObject *pRoot = static_cast<QObject*>(view->rootObject()); //将qml文件转为QObject对象
  2. if(pRoot != nullptr) //转换成功后可以将qml里面的信号和cpp里面的槽函数链接起来
  3. {
  4. connect(pRoot,SIGNAL(signal2qml()),this,SLOT(resiveFromQml()));
  5. //connect(m_pButton,SIGNAL(clicked(bool)),pRoot,SIGNAL(signal2qml()));
  6. }

运行后,qml嵌入了qWidget里面了,qml里面的矩形的text被timeout信号一直改变,点击sub时的信号会触发widget的resiveFromQml的槽函数。

from

一个简单的qml嵌入widget的Demo;

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/831274
推荐阅读
相关标签
  

闽ICP备14008679号