日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt工作笔记-QML界面与QWidgets界面相互交互

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt工作笔记-QML界面与QWidgets界面相互交互 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++要做的事情:

1.QML中注冊C++類型(qmlRegisterType)

2.獲取元對象樹,從中提取注冊的指針【這樣就和普通的對象一樣了】

?

qml要做的事情:

1.import注冊的C++類型

2.使用onXXX進行qml與C++的交互

?

通過Q_PROPERTY進行交互

?

-----------------------------------------------------------

因為qml啟動開銷大,第一次是創造界面,然后在第二次,第三次等僅僅是隱藏,并沒有銷毀窗口;

程序運行截圖如下:

源碼如下:

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_H

main.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數據發出窗口")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()}}} }

?

總結

以上是生活随笔為你收集整理的Qt工作笔记-QML界面与QWidgets界面相互交互的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。