将Widget嵌入到基于Qml的应用程序中的原因

时间:2015-08-05 09:13:23

标签: qt qml qwidget qt5.2

我必须在基于Qml的应用程序中重用Widget应用程序和最新的Qt版本(Qt 5.2)。但是对于大多数人来说,这样做是非常糟糕的。

有人可以解释,为什么这是个坏主意?

部分代码段

*的.h

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);
};

*。CPP

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");
}

* .qml文件

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")
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

因为您不想在不需要时添加对3d渲染的依赖性。 3d渲染可能导致massive trouble数量proper file dialogs,您可以在没有Qt Quick的Qt Widgets应用程序中避免这种情况。

如果您打算开发Qt Quick应用程序,很可能在某些时候您需要来自Qt Widgets的东西。这适用于例如当您需要tray iconshere或只想获得Qt Widgets QApplication中的原生系统颜色而不是Qt Quick {{1}时的颜色时}}。因此,根据我自己的经验,我反对Micht指出对Qt Widgets的不必要的依赖

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

答案 1 :(得分:0)

这很有意思,我不知道你能做到这一点!

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

  1. 用于存储和构建每个QWidget::render()实例的不必要的内存开销(这包括小部件可能进行的任何信号/插槽连接)。
  2. 不必要地遍历QQuickPaintedItem::paint()代码路径。我没有考虑过这是多么复杂,但这是需要考虑的事情。
  3. 对Qt Widgets的不必要的依赖。
  4. 失去交互(鼠标,键盘,触摸等),假设小部件首先有任何内容。
  5. 这些都假设您不需要其他东西的小部件依赖。如果你出于某种原因确实在同一个应用程序的其他地方需要它,它听起来并不那么疯狂(感觉奇怪的是写这个......)。实际上,我非常有兴趣听到为什么这是一个坏主意。

    所以,问题是,为什么你不能将绘画命令从小部件中移出并直接进入{{1}}实现?您是否需要在Qt Quick应用程序中使用小部件来处理其他事情?如果是这样,是什么?