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++中显示。这一套流程下来,感觉以后程序员都不用写界面了。恐怖如斯

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过在Qt中使用QQuickWidget来在QML中嵌入QWidget控件。 首先,将QWidget控件包装到一个QQuickItem中,可以使用如下代码: ``` c++ #include <QQuickPaintedItem> #include <QPainter> class QWidgetItem : public QQuickPaintedItem { Q_OBJECT public: QWidgetItem(QQuickItem *parent = nullptr) : QQuickPaintedItem(parent) , m_widget(nullptr) { setFlag(QQuickItem::ItemHasContents, true); } QWidget *widget() const { return m_widget; } void setWidget(QWidget *widget) { if (m_widget) { delete m_widget; m_widget = nullptr; } m_widget = widget; if (m_widget) { m_widget->setParent(this); m_widget->installEventFilter(this); m_widget->setFixedSize(width(), height()); m_widget->show(); } } protected: void paint(QPainter *painter) override { if (m_widget && m_widget->isVisible()) { m_widget->render(painter); } } bool eventFilter(QObject *obj, QEvent *event) override { if (event->type() == QEvent::Resize) { m_widget->setFixedSize(width(), height()); } return QQuickPaintedItem::eventFilter(obj, event); } private: QWidget *m_widget; }; ``` 然后,在QML中使用该自定义QQuickItem控件,如下所示: ``` qml import QtQuick 2.0 Item { width: 640 height: 480 QWidgetItem { id: widgetItem anchors.fill: parent } Component.onCompleted: { var widget = new QWidget(); var layout = new QVBoxLayout(widget); var label = new QLabel("Hello, QWidget!"); label.setAlignment(Qt.AlignCenter); layout.addWidget(label); widget.setLayout(layout); widgetItem.setWidget(widget); } } ``` 这里我们创建了一个QWidget,将一个QLabel控件放置其中,然后将QWidget设置为我们自定义的QQuickItem控件的子控件,即可在QML中嵌入QWidget控件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值