Qt之QWidget自定义控件与qml界面互相调用

1.在Qt-C++中调用qml的界面

Qt4

pro文件中加上        QT+=declarative

QDeclarativeView *view = new QDeclarativeView;
view->setSource(QUrl::fromLocalFile("file.qml"));
view->show();

 Qt5

pro文件中加上        QT+=quickwidgets

QQuickWidget *view = new QQuickWidget;
view->setSource(QUrl::fromLocalFile("file.qml"));
view->show();

 QDeclarativeView 与QQuickWidget 都继承自QWidget,可以当做QWidget处理,加入到其他容器或者QLayout中,即可在gui中显示qml的界面。

2.在qml中调用QWidget自定义控件

(1)自定义一个类,如MyWidget,继承于QQuickPaintedItem

#include <QQuickPaintedItem>

class MyWidget: public QQuickPaintedItem
{
    Q_OBJECT
    Q_PROPERTY(int mWidth READ getWidth WRITE setWidth)//可增加qml属性
    Q_PROPERTY(int mHeight READ getHeight WRITE setHeight)

public:
    MyWidget(QQuickItem *parent = 0);
    virtual ~MyWidget();

    int getWidth() const;
    void setWidth(int w);

    int getHeight() const;
    void setHeight(int h);

    Q_INVOKABLE int doSomeThing();//可增加qml方法

protected:
    virtual void paint(QPainter *painter) override;//自绘控件

signals:
    void somethingHappend(const QString &msg);

private:
    int m_Width;
    int m_Height;
}

(2)然后注册qml类型

qmlRegisterType<MyWidget>("widget.test",1,0,"MyWidget");

(3)qml中调用

import QtQuick 2.9
import QtQuick.Window 2.2

import widget.test 1.0

Window {
    width: 500
    height: 800
    title: qsTr("QQuickPaintedItem test")

    MyWidget
    {
        id: testWidgetId
        anchor.fill: parent
        mWidth: parent.width
        mHeight: parent.height

        onSomethingHappend {
            console.log("getMsg: "+msg)
        }

        MouseArea {
            anchors.fill: parent
            onClicked: {
                testWidgetId.doSomeThing();
            }   
        }
    }
}

 最近留意到Qt Design Studio这个工具,可以直接从photshop导入,UI设计直接转换为qml。而qml界面又可以在C++中显示。这一套流程下来,感觉以后程序员都不用写界面了。恐怖如斯

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值