Qt工作笔记-QML界面与QWidgets界面相互交互
生活随笔
收集整理的這篇文章主要介紹了
Qt工作笔记-QML界面与QWidgets界面相互交互
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++要做的事情:
1.QML中注冊C++類型(qmlRegisterType)
2.獲取元對象樹,從中提取注冊的指針【這樣就和普通的對象一樣了】
?
qml要做的事情:
1.import注冊的C++類型
2.使用onXXX進行qml與C++的交互
?
通過Q_PROPERTY進行交互
?
-----------------------------------------------------------
因為qml啟動開銷大,第一次是創(chuàng)造界面,然后在第二次,第三次等僅僅是隱藏,并沒有銷毀窗口;
程序運行截圖如下:
源碼如下:
test.h
#ifndef TEST_H #define TEST_H#include <QObject>class Test : public QObject {Q_OBJECT public:explicit Test(QObject *parent = 0);Q_PROPERTY(QString msg READ msg WRITE setMeg NOTIFY msgChanged)Q_PROPERTY(QString close READ close WRITE setClose NOTIFY closeChanged)QString msg();QString close();void setClose(QString close);void setMeg(QString msg); signals:void msgChanged();void aquireData(QString msg);void closeChanged();void hideQMLWindow();private:QString m_msg; };#endif // TEST_H?
widget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> class QQmlApplicationEngine; class Test;namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void btnClicked();void getMes(QString msg);void closeQML();private:Ui::Widget *ui;QQmlApplicationEngine *m_engine;Test *m_test;bool m_windowShow;bool m_realLoad; };#endif // WIDGET_Hmain.cpp
#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }test.cpp
#include "test.h" #include <QDebug>Test::Test(QObject *parent) : QObject(parent) {}QString Test::msg() {return ""; }QString Test::close() {}void Test::setClose(QString close) {Q_UNUSED(close)emit closeChanged();emit hideQMLWindow(); }void Test::setMeg(QString msg) {emit aquireData(msg); }widget.cpp
#include "widget.h" #include "ui_widget.h" #include "test.h" #include <QDebug> #include <QQmlApplicationEngine> #include <QQuickView> #include <QList> #include <typeinfo>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);m_realLoad=false;m_windowShow=false;m_engine=new QQmlApplicationEngine;connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked())); }Widget::~Widget() {delete ui; }void Widget::btnClicked() {if(m_windowShow){return;}if(m_realLoad){qDebug()<<"開啟";m_test->setClose("開啟");return;}qmlRegisterType<Test>("Test",1,0,"Test");m_engine->load(QUrl(QLatin1String("qrc:/example.qml")));QList<QObject*> qmlList=m_engine->rootObjects();QObjectList list=qmlList[0]->children()[0]->children();for(int i=0;i<list.size();i++){if(QString(typeid(*list[i]).name()).contains("Test")){m_test=qobject_cast<Test*>(list[i]);connect(m_test,SIGNAL(aquireData(QString)),this,SLOT(getMes(QString)));connect(m_test,SIGNAL(deleteQMLWindow()),this,SLOT(closeQML()));m_windowShow=true;m_realLoad=true;break;}} }void Widget::getMes(QString msg) {QStringList list=msg.split(";");for(int i=0;i<list.size();i++){ui->plainTextEdit->insertPlainText(list[i]+"\n");}ui->plainTextEdit->insertPlainText("---------------------\n");m_windowShow=false; }void Widget::closeQML() {m_windowShow=false; }?
example.qml
import QtQuick 2.5 import QtQuick.Window 2.2 import Test 1.0 import QtQuick.Controls 1.4Window {id:windowvisible: truewidth: 240height: 100title: qsTr("QML數(shù)據(jù)發(fā)出窗口")onClosing: {test.close="close"window.hide()}Column{spacing:2Row{spacing:2Label{text:"姓名:"font.pixelSize: 22font.italic: true}TextEdit{id:namewidth:240font.pixelSize: 20}}Row{spacing:2Label{text:"性別:"font.pixelSize: 22font.italic: true}TextEdit{id:sexwidth:240font.pixelSize: 20}}Row{spacing:2Label{text:"年齡:"font.pixelSize: 22font.italic: true}TextEdit{id:agewidth:240font.pixelSize: 20}}Button{id:submitwidth:240text: qsTr("提交")onClicked:{test.msg="姓名:"+name.text+";"+"性別:"+sex.text+";"+"年齡:"+age.textwindow.hide();}}Test{id:testonCloseChanged:{window.show()}}} }?
總結(jié)
以上是生活随笔為你收集整理的Qt工作笔记-QML界面与QWidgets界面相互交互的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-QHash与QMap查找速
- 下一篇: Qt工作笔记-通过信号与槽实现定时器