当前位置:   article > 正文

qt 中 qwidget 嵌入 qml_qwidget嵌入qml

qwidget嵌入qml

 以上是效果图, 整个窗口是 qml 窗口

核心代码

  1. #ifndef WIDGETANCHOR_H
  2. #define WIDGETANCHOR_H
  3. #include <QObject>
  4. #include <QQuickItem>
  5. #include <QWidget>
  6. #include <QQmlApplicationEngine>
  7. #include <QQmlContext>
  8. class WgtAnchorMgr: public QObject
  9. {
  10. QWidget * _p_wgt = nullptr;
  11. QQuickItem* _p_quick_item =nullptr;
  12. public:
  13. WgtAnchorMgr();
  14. WgtAnchorMgr(QWidget* pWidget, QQuickItem* pItem);
  15. bool init_info(QWidget* pWidget, QQuickItem* pItem);
  16. bool init_info(QQmlApplicationEngine &engine, const QString &object_name, QWidget* pWidget);
  17. bool init_info(QQmlApplicationEngine &engine, const QString &object_name, std::function<QWidget *()> fun);
  18. void init_connect();
  19. ~WgtAnchorMgr();
  20. private:
  21. void updateGeometry();
  22. };
  23. #endif // WIDGETANCHOR_H
  1. #include "WgtAnchorMgr.h"
  2. #include <QQuickItem>
  3. #include "WgtAnchorMgr.h"
  4. #include <QQuickWidget>
  5. #include <QQmlContext>
  6. WgtAnchorMgr::WgtAnchorMgr()
  7. {
  8. }
  9. WgtAnchorMgr::WgtAnchorMgr(QWidget* pWidget, QQuickItem* pItem)
  10. : QObject(pWidget), _p_wgt(pWidget), _p_quick_item(pItem)
  11. {
  12. connect(_p_quick_item, &QQuickItem::xChanged, this, &WgtAnchorMgr::updateGeometry);
  13. connect(_p_quick_item, &QQuickItem::yChanged, this, &WgtAnchorMgr::updateGeometry);
  14. connect(_p_quick_item, &QQuickItem::widthChanged, this, &WgtAnchorMgr::updateGeometry);
  15. connect(_p_quick_item, &QQuickItem::heightChanged, this, &WgtAnchorMgr::updateGeometry);
  16. updateGeometry();
  17. }
  18. bool WgtAnchorMgr::init_info(QWidget *pWidget, QQuickItem *pItem)
  19. {
  20. if(nullptr == pWidget || nullptr == pItem)
  21. return false;
  22. _p_wgt = pWidget;
  23. _p_quick_item = pItem;
  24. return true;
  25. }
  26. bool WgtAnchorMgr::init_info(QQmlApplicationEngine &engine, const QString &object_name, QWidget *pWidget)
  27. {
  28. if(nullptr == pWidget)
  29. return false;
  30. for(auto obj : engine.rootObjects())
  31. {
  32. if(obj->findChild<QQuickItem*>("widgetItem"))
  33. {
  34. _p_quick_item = obj->findChild<QQuickItem*>(object_name);
  35. if(nullptr == _p_quick_item)
  36. continue;
  37. QWindow * mainWindow = qobject_cast<QWindow*>(obj);
  38. WId proc2Window_HWND = mainWindow->winId();
  39. _p_wgt = pWidget;
  40. _p_wgt->setProperty("_q_embedded_native_parent_handle", QVariant(proc2Window_HWND));
  41. _p_wgt->setWindowFlags(Qt::Widget|Qt::FramelessWindowHint);
  42. _p_wgt->winId();
  43. _p_wgt->windowHandle()->setParent(mainWindow);
  44. engine.rootContext()->setContextProperty("WidgetAnchor", this);
  45. return true;
  46. }
  47. }
  48. return false;
  49. }
  50. bool WgtAnchorMgr::init_info(QQmlApplicationEngine &engine, const QString &object_name, std::function<QWidget *()> fun)
  51. {
  52. for(auto obj : engine.rootObjects())
  53. {
  54. if(obj->findChild<QQuickItem*>("widgetItem"))
  55. {
  56. _p_quick_item = obj->findChild<QQuickItem*>(object_name);
  57. if(nullptr == _p_quick_item)
  58. continue;
  59. QWindow * mainWindow = qobject_cast<QWindow*>(obj);
  60. WId proc2Window_HWND = mainWindow->winId();
  61. _p_wgt = fun();
  62. if(nullptr == _p_wgt)
  63. return false;
  64. _p_wgt->setProperty("_q_embedded_native_parent_handle", QVariant(proc2Window_HWND));
  65. _p_wgt->setWindowFlags(Qt::Widget|Qt::FramelessWindowHint);
  66. _p_wgt->winId();
  67. _p_wgt->windowHandle()->setParent(mainWindow);
  68. engine.rootContext()->setContextProperty("WidgetAnchor", this);
  69. return true;
  70. }
  71. }
  72. return false;
  73. }
  74. void WgtAnchorMgr::init_connect()
  75. {
  76. connect(_p_quick_item, &QQuickItem::xChanged, this, &WgtAnchorMgr::updateGeometry);
  77. connect(_p_quick_item, &QQuickItem::yChanged, this, &WgtAnchorMgr::updateGeometry);
  78. connect(_p_quick_item, &QQuickItem::widthChanged, this, &WgtAnchorMgr::updateGeometry);
  79. connect(_p_quick_item, &QQuickItem::heightChanged, this, &WgtAnchorMgr::updateGeometry);
  80. updateGeometry();
  81. }
  82. WgtAnchorMgr::~WgtAnchorMgr()
  83. {
  84. disconnect(_p_quick_item, 0, 0, 0);
  85. delete _p_wgt;
  86. qDebug()<<"=============~WgtAnchorMgr==============";
  87. }
  88. void WgtAnchorMgr::updateGeometry()
  89. {
  90. if (_p_quick_item)
  91. {
  92. QRectF r = _p_quick_item->mapRectToItem(0, QRectF(_p_quick_item->x(), _p_quick_item->y(), _p_quick_item->width(), _p_quick_item->height()));
  93. qDebug()<<" r ===="<<r;
  94. _p_wgt->setGeometry(r.toRect());
  95. }
  96. _p_wgt->show();
  97. }

使用

  1. #include <QApplication>
  2. #include <QQmlApplicationEngine>
  3. #include "mywgt.h"
  4. #include <QQuickItem>
  5. #include "WgtAnchorMgr.h"
  6. #include <QQuickWidget>
  7. #include <QQmlContext>
  8. int main(int argc, char *argv[])
  9. {
  10. #if defined(Q_OS_WIN)
  11. QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  12. #endif
  13. QApplication app(argc, argv);
  14. QQmlApplicationEngine engine;
  15. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  16. if (engine.rootObjects().isEmpty())
  17. return -1;
  18. // auto pqw = new QQuickWidget;
  19. // pqw->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
  20. // pqw->setResizeMode(QQuickWidget::SizeRootObjectToView);
  21. // pqw->setAttribute(Qt::WA_DeleteOnClose);
  22. // auto pOwt = new MyWgt(pqw); // 自定义 widget窗体
  23. // auto pOverlayItem = pqw->rootObject()->findChild<QQuickItem*>("widgetItem");
  24. // if (nullptr != pOverlayItem)
  25. // {
  26. // qDebug()<<"===="<<pOverlayItem;
  27. // new WidgetAnchor(pOwt, pOverlayItem);
  28. // }
  29. // pqw->show();
  30. WgtAnchorMgr wgt_anchor;
  31. // if(wgt_anchor.init_info(engine, "widgetItem", []()->QWidget*{return new MyWgt;}))
  32. // wgt_anchor.init_connect();
  33. for(auto obj : engine.rootObjects())
  34. {
  35. if(obj->findChild<QQuickItem*>("widgetItem"))
  36. {
  37. auto pOverlayItem = obj->findChild<QQuickItem*>("widgetItem");
  38. qDebug()<<"===="<<pOverlayItem;
  39. QWindow * mainWindow = qobject_cast<QWindow*>(obj);
  40. WId proc2Window_HWND = mainWindow->winId();
  41. auto pOwt = new MyWgt;
  42. pOwt->setProperty("_q_embedded_native_parent_handle", QVariant(proc2Window_HWND));
  43. pOwt->setWindowFlags(Qt::Widget|Qt::FramelessWindowHint);
  44. pOwt->winId();
  45. pOwt->windowHandle()->setParent(mainWindow);
  46. //WidgetAnchor anchor(pOwt, pOverlayItem);
  47. //pwgt_anchor = new WidgetAnchor(pOwt, pOverlayItem);
  48. if(wgt_anchor.init_info(pOwt, pOverlayItem))
  49. wgt_anchor.init_connect();
  50. engine.rootContext()->setContextProperty("WidgetAnchor", &wgt_anchor);
  51. break;
  52. }
  53. }
  54. // QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [pwgt_anchor](QObject* obj, const QUrl& objUrl)
  55. // {
  56. // qDebug()<<"=============~WidgetAnchor==============";
  57. // delete pwgt_anchor;
  58. // //if (!obj && url == objUrl) QCoreApplication::exit(-1);
  59. // }, Qt::QueuedConnection);
  60. return app.exec();
  61. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/831230
推荐阅读
相关标签
  

闽ICP备14008679号