Qt 为什么将小部件嵌入基于Qml的应用程序是个坏主意

Qt 为什么将小部件嵌入基于Qml的应用程序是个坏主意,qt,qml,qwidget,qt5.2,Qt,Qml,Qwidget,Qt5.2,我必须使用最新的Qt版本(Qt5.2)在基于Qml的应用程序中重用小部件应用程序。但大多数人认为这样做是非常糟糕的 有人能解释一下为什么这是个坏主意吗 一些代码片段 *h *.cpp 真有趣,我不知道你能做到 以下是我能想到的一些原因: 存储和构造每个QWidget实例所需的不必要内存开销(包括widget可能进行的任何信号/插槽连接) 不必要地运行QWidget::render()代码路径。我还没有研究这是多么复杂,但这是一个值得考虑的问题。 对Qt小部件不必要的依赖 失去交互(鼠标、键盘、触

我必须使用最新的Qt版本(Qt5.2)在基于Qml的应用程序中重用小部件应用程序。但大多数人认为这样做是非常糟糕的

有人能解释一下为什么这是个坏主意吗

一些代码片段

*h

*.cpp


真有趣,我不知道你能做到

以下是我能想到的一些原因:

  • 存储和构造每个
    QWidget
    实例所需的不必要内存开销(包括widget可能进行的任何信号/插槽连接)
  • 不必要地运行
    QWidget::render()
    代码路径。我还没有研究这是多么复杂,但这是一个值得考虑的问题。
  • 对Qt小部件不必要的依赖
  • 失去交互(鼠标、键盘、触摸等),假设小部件一开始就有
  • 所有这些都假设您不需要对其他事情依赖小部件。如果出于某种原因,您确实需要在同一应用程序中的其他位置使用它,那么它听起来就不那么疯狂了(写这篇文章感觉很奇怪……)。事实上,我自己也很想听听为什么这是个坏主意


    所以,问题是,为什么不能将绘制命令移出小部件,直接放入
    QQuickPaintedItem::paint()
    实现中?您是否需要Qt Quick应用程序中的小部件来实现其他功能?如果是,什么?

    因为您不想在不需要的情况下添加对3d渲染的依赖。3d渲染可能会导致大量的错误,这在没有Qt Quick的Qt Widgets应用程序中是可以避免的

    如果您计划开发一个QtQuick应用程序,那么在某个时候您可能需要来自QtWidget的东西。例如,当您需要或只想获得Qt Widgets
    QApplication
    中的本机系统颜色,但Qt Quick的
    QGuiApplication
    中没有本机系统颜色时,这一点适用。因此,根据我自己的经验,我反对Micht对Qt小部件的不必要依赖


    因此,对于使用现有QWidgets的新Qt Quick应用程序,我认为这是一个很好的中间步骤。

    您打算怎么做?我使用了新Qt版本中的QQuickPaintedItem和QQmlExtensionPlugin类。所以。。。那就没有小部件了?我错过了什么p这听起来是一个非常明智的方法,假设您只是从您的小部件类复制了
    QPainter
    命令,而没有与小部件相关的内容。关于系统颜色的观点很好。我无法想象其他东西对于嵌入式或移动设备经常是必要的。
    class MyAppItem: public QQuickPaintedItem{
        Q_OBJECT
    public:
    
        explicit MyAppItem(QQuickItem *parent = 0);
        void paint(QPainter *painter);
    private:
    
        CMyAppWidget *bp;
    };
    
    class RouteBWExtensionPlugin: public QQmlExtensionPlugin
    {
      Q_OBJECT
      Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
    
    public:
    
      /**
      * @brief                register the plugin
      * @param[in]  uri to be registered
      */
      void registerTypes(const char * uri);
    };
    
    MyAppItem::MyAppItem(QQuickItem *parent)
        : QQuickPaintedItem(parent)
    {
        bp = new CMyAppWidget();
    }
    
    void MyAppItem::paint(QPainter *painter)
    {
        bp->render(painter);
    }
    
    void RouteBWExtensionPlugin::registerTypes(const char * uri)
    {
      qmlRegisterType<MyAppItem>(uri, 1, 0, "MyAppItem");
    }
    
    import MyAppWidget 1.0
    Item {
        width: 300
        height: 10
        anchors.right: parent
        MyAppItem {
            width: 94
            height: 240
            anchors.right: parent
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    console.log("[veo] onClicked - capture triggered")
                }
            }
        }
    }