Почему плохая идея встроить виджет в приложение на основе Qml

Я должен повторно использовать приложение Widget в приложении на основе Qml с последней версией Qt (Qt 5.2). Но для большинства людей это очень плохая идея.

Может кто-нибудь объяснить, почему это плохая идея?

Часть кода,

*.час

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 ответа

Потому что вы не хотите добавлять зависимость от 3D-рендеринга, когда вам это не нужно. 3D-рендеринг может вызвать массу проблем, которых вы могли бы избежать в приложении Qt Widgets без Qt Quick.

Если вы планируете разрабатывать приложение Qt Quick, вполне вероятно, что в какой-то момент вам понадобятся материалы из Qt Widgets. Это относится, например, когда вам нужны правильные диалоговые окна файлов, значки в трее или вы просто хотите получить собственные системные цвета, которые есть в виджетах Qt QApplication но не в Qt Quick's QGuiApplication, Так что я бы поспорил с точкой зрения Михта Ненужная зависимость от виджетов Qt, основанная на моем собственном опыте.

Поэтому для новых приложений Qt Quick, использующих существующие QWidgets, я думаю, что это хороший промежуточный шаг.

Это интересно, я не знал, что ты мог сделать это!

Вот несколько причин, о которых я могу думать:

  1. Ненужные накладные расходы памяти для хранения и конструирования каждого QWidget экземпляр (это включает в себя любые соединения сигнал / слот, которые могут создавать виджеты).
  2. Бег через QWidget::render() путь к коду без необходимости. Я не смотрел, насколько это сложно, но это то, что нужно учитывать.
  3. Ненужная зависимость от виджетов Qt.
  4. Потеря взаимодействия (мышь, клавиатура, прикосновение и т. Д.), Если предположить, что виджет изначально был.

Все это предполагает, что вам не нужна зависимость виджета для других вещей. Если вам это нужно по какой-то причине в другом приложении, это не звучит так безумно (кажется странным писать это...). На самом деле мне было бы очень интересно услышать причины, по которым это сама идея плохая.

Итак, вопрос в том, почему вы не можете просто переместить команды рисования из виджета прямо в ваш QQuickPaintedItem::paint() реализация? Вам нужны виджеты в вашем приложении Qt Quick для других вещей? Если да, то?

Другие вопросы по тегам