将qml界面嵌入到QWidget应用程序中,并实现通信。mark~
尊重原创:将 QML 与 Qt Widgets 相结合
上代码:
myqmlfile.qml
import QtQuick 2.1
Rectangle {
id: root
color: "green"
width: 200
height: 200
// 发送给 Qt Widgets 的信号
signal qmlSignal
// 从 Qt Widgets 接收到的信号
signal cSignal
Text {
id: myText
text: "Click me"
font.pointSize: 14
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: qmlSignal()
}
// 信号处理程序(处理从 Qt Widgets 接收到的信号)
onCSignal: {
root.color = "blue"
myText.text = "Call the qml signal handler"
}
}
#include "widget.h"
#include <QQuickView>
#include <QVBoxLayout>
#include <QQuickWidget>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
resize(300, 300);
// 方式一
// QQuickView *pView = new QQuickView();
// QWidget *pWidget = QWidget::createWindowContainer(pView, this);
// pView->setResizeMode(QQuickView::SizeRootObjectToView);
// pView->setSource(QUrl("qrc:/main.qml"));
// 方式二
QQuickWidget *pWidget = new QQuickWidget();
pWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
pWidget->setSource(QUrl("qrc:/main.qml"));
m_pButton = new QPushButton(this);
m_pButton->setText("Qt Widgets...");
QVBoxLayout *pLayout = new QVBoxLayout();
pLayout->addWidget(pWidget);
pLayout->addWidget(m_pButton);
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10);
setLayout(pLayout);
// QML 与 Qt Widgets 通信
// QObject *pRoot = (QObject*)pView->rootObject();
QObject *pRoot = (QObject*)pWidget->rootObject();
if (pRoot != NULL) {
connect(pRoot, SIGNAL(qmlSignal()), this, SLOT(receiveFromQml()));
connect(m_pButton, SIGNAL(clicked(bool)), pRoot, SIGNAL(cSignal()));
}
}
void Widget::receiveFromQml()
{
m_pButton->setText("Call the C++ slot");
}