qml嵌入到QWidget中的简单使用

13 篇文章 0 订阅
//方法一 使用QQuickView 
//main.qml
import QtQuick 2.0

Rectangle {
    signal qmlSigClick()

    x : 200
    width: quickWidgetWidth
    height: quickWidgetHeight
    radius: quickWidgetWidth/2
    color: "green"
    Text {
        anchors.fill: parent
        id: name
        text: qsTr("qml")
        color: "white"
        font.pixelSize: 40
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }

    MouseArea{
        anchors.fill:parent
        onClicked: qmlSigClick()
    }

    function test(){
        console.log("test")
    }
}

//mainwindow.cpp
#include <QQuickView>
#include <QQmlContext>
#include <QQuickItem>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->resize(600, 400);

    QQuickView *mQuickView = new QQuickView();


    QWidget *mQuickWidget = QWidget::createWindowContainer(mQuickView, this);
    //设置被嵌入的窗口大小和位置
     mQuickWidget->move(0,200);
     //mQuickWidget->setMinimumSize(80,30);
     //mQuickWidget->show(); // 显示qml
     mQuickWidget->resize(600,200);

     QQmlContext *mQuickContext = mQuickView->rootContext();// 用于与qml交互

     //首先进行读取,属性名:quickWidgetWidth、quickWidgetHeigh
     int width = mQuickContext->contextProperty("quickWidgetWidth").toInt();
     int hight = mQuickContext->contextProperty("quickWidgetHeight").toInt();
     qDebug()<<"width:"<<width;
     qDebug()<<"hight:"<<hight;

     //设置qml控件quickWidgetWidth、quickWidgetHeigh属性
     mQuickContext->setContextProperty("quickWidgetWidth", 200);
     mQuickContext->setContextProperty("quickWidgetHeight", 200);

     //读取显示,测试是否写入成功
     width = mQuickContext->contextProperty("quickWidgetWidth").toInt();
     hight = mQuickContext->contextProperty("quickWidgetHeight").toInt();
     qDebug()<<"width:"<<width;
     qDebug()<<"hight:"<<hight;

     mQuickView->setSource(QUrl("qrc:/main.qml"));
     QObject *pRoot = static_cast<QObject*>(mQuickView->rootObject());
     if(pRoot != nullptr)
     {
         connect(pRoot,SIGNAL(qmlSigClick()),this,SLOT(resiveFromQml()));
         connect(ui->pushButton,SIGNAL(clicked()),pRoot, SLOT(test()));
     }
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::resiveFromQml()
{
    qDebug() << "resiveFromQml";
}

//mainwindow.h
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

public slots:
    void resiveFromQml();
};
//方法二 使用QQuickWidget
//在窗口构造函数添加如下代码
QQuickWidget *qmlWidget = new QQuickWidget(QUrl("qrc:/main.qml"), this);
qmlWidget->setAttribute(Qt::WA_AlwaysStackOnTop);
qmlWidget->setClearColor(Qt::transparent);
qmlWidget->setResizeMode(QQuickWidget::SizeViewToRootObject);
qmlWidget->move(0, 200);
qmlWidget->setFixedSize(600, 200);
qmlWidget->show();

//qml
import QtQuick 2.0

Rectangle {
    signal qmlSigClick()

    x : 200
    width: 200
    height: 200
    radius: 200/2
    color: "green"
    Text {
        anchors.fill: parent
        id: name
        text: qsTr("qml")
        color: "white"
        font.pixelSize: 40
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }

    MouseArea{
        anchors.fill:parent
        onClicked: {
            console.log("click")
            qmlSigClick()
        }
    }

    function test(){
        console.log("test")
    }
}

运行测试效果如下图:
在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值