当前位置:   article > 正文

Qt Qml嵌入Widget以及Qml与Widget交互_qt 嵌入qml 并实现交互

qt 嵌入qml 并实现交互

这里是在Win10下,使用Qt5.7.0(cpp+qml)实现Qml嵌入Widget以及Qml与Widget交互。

QQuickWidget类,可以解决此问题。

1、先在pro是加入

QT += quickwidgets

2、新建QmlWidget类,并继承QWidget。

main.cpp如下

  1. #include <QApplication>
  2. #include "qmlwidget.h"
  3. int main(int argc, char *argv[]) {
  4. QApplication app(argc, argv);
  5. QmlWidget qmlWidget;
  6. return app.exec();
  7. }

3、qmlwidget.h如下

  1. #ifndef QMLWIDGET_H
  2. #define QMLWIDGET_H
  3. #include <QQuickWidget>
  4. #include <QQmlEngine>
  5. #include <QVBoxLayout>
  6. class QmlWidget : public QWidget
  7. {
  8. Q_OBJECT
  9. public:
  10. explicit QmlWidget(QWidget *parent = 0);
  11. private:
  12. QVBoxLayout * layout;
  13. QQuickWidget * quickWidget;
  14. signals:
  15. void sigWidget(void);
  16. public slots:
  17. void slotWidget(void);
  18. void btnClicked(void);
  19. };
  20. #endif // QMLWIDGET_H

4、qmlwidget.cpp如下

  1. #include "qmlwidget.h"
  2. #include <QDebug>
  3. #include <QPushButton>
  4. QmlWidget::QmlWidget(QWidget *parent) : QWidget(parent) {
  5. quickWidget = new QQuickWidget();
  6. quickWidget->setSource(QUrl("qrc:///main.qml"));
  7. layout = new QVBoxLayout(this);
  8. QPushButton *btn1 = new QPushButton(this);
  9. btn1->setText("widget btn");
  10. layout->addWidget(btn1);
  11. connect(btn1,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));
  12. QObject * obj = (QObject*)quickWidget->rootObject();
  13. connect(obj,SIGNAL(qmlClicked()),this,SLOT(slotWidget()));
  14. connect(this,SIGNAL(sigWidget()),obj,SIGNAL(widgetClicked()));
  15. quickWidget->setLayout(layout);
  16. quickWidget->show();
  17. }
  18. void QmlWidget::slotWidget() {
  19. qDebug()<<"qml sig to widget slot";
  20. emit sigWidget();
  21. }
  22. void QmlWidget::btnClicked() {
  23. qDebug()<<"widget btn clicked";
  24. }

5、main.qml如下

  1. import QtQuick 2.4
  2. import QtQuick.Layouts 1.2
  3. import QtQuick.Controls 1.4
  4. import QtQuick.Dialogs 1.2
  5. Rectangle {
  6. id : root;
  7. width: 300
  8. height: 300
  9. color: "yellow"
  10. signal qmlClicked()
  11. signal widgetClicked()
  12. onWidgetClicked: {
  13. console.log("widget sig to qml slot")
  14. }
  15. Button {
  16. id : qmlBtn
  17. anchors.top: parent.top
  18. text : "qml btn"
  19. onClicked: {
  20. console.log("qml btn clicked")
  21. }
  22. }
  23. Button {
  24. anchors.left: qmlBtn.right
  25. anchors.leftMargin: 8
  26. text : "connect btn"
  27. onClicked: {
  28. qmlClicked()
  29. }
  30. }
  31. }

6、运行效果如下

7、注意事项。

quickWidget的rootObject()是main.qml中的根对象,也就是root,它要转换为QObject*类型才能使用connect。

quickWidget不能直接连接到qml的槽上,但是可以连接到qml的信号上,让信号去触发qml的槽。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目,C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

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

闽ICP备14008679号