3

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

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

一些代码片段,

*。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")
            }
        }
    }
}
4

2 回答 2

1

因为您不想在不需要时添加对 3d 渲染的依赖。3d 渲染可能会导致大量麻烦,在没有 Qt Quick 的 Qt Widgets 应用程序中,您可能可以避免这些问题。

如果您计划开发一个 Qt Quick 应用程序,很可能在某些时候您需要来自 Qt Widgets 的东西。例如,当您需要适当的文件对话框托盘图标或只想获得 Qt WidgetsQApplication中但 Qt Quick 中没有的本机系统颜色时,这适用QGuiApplication。因此,根据我自己的经验,我会反对 Micht对 Qt Widgets 的不必要依赖的观点。

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

于 2015-08-05T21:15:15.380 回答
0

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

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

  1. 存储和构造每个QWidget实例的不必要的内存开销(这包括小部件可能建立的任何信号/插槽连接)。
  2. QWidget::render()不必要地运行代码路径。我没有研究过这有多复杂,但这是需要考虑的事情。
  3. 对 Qt Widgets 的不必要依赖。
  4. 假设小部件首先有任何交互(鼠标、键盘、触摸等)丢失。

这些都假设您不需要小部件依赖项来处理其他事情。如果您出于某种原因在同一个应用程序中的其他地方确实需要它,它听起来并不那么疯狂(写这个感觉很奇怪......)。我实际上很想听听为什么我自己这是一个坏主意的原因。

那么,问题是,为什么不能将绘画命令从小部件中移出并直接移到您的QQuickPaintedItem::paint()实现中呢?您是否需要 Qt Quick 应用程序中的小部件来处理其他事情?如果是这样,是什么?

于 2015-08-05T15:08:00.883 回答