2015-08-05 12 views
3

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

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

Некоторые из фрагмента кода,

* .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") 
      } 
     } 
    } 
} 
+0

Как вы планируете это делать? – Mitch

+0

Я использовал класс QQuickPaintedItem и QQmlExtensionPlugin из новой версии Qt. – Swapnil

+1

Итак ... нет виджетов? Что мне здесь не хватает?: p Это звучит как очень разумный способ сделать это, предполагая, что вы просто скопировали команды 'QPainter' из ваших классов виджетов и никаких связанных с виджетами вещей. – Mitch

ответ

0

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

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

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

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

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

1

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

Если вы планируете разрабатывать приложение Qt Quick, вполне вероятно, что в какой-то момент вам понадобятся вещи из Qt Widgets. Это относится, например, когда вам нужно proper file dialogs, tray icons или просто хотите получить собственные системные цвета, которые у вас есть в Qt Widgets QApplication, но не в Qt Quick's QGuiApplication. Поэтому я бы возразил против точки Micht Ненужная зависимость от Qt Widgets, основанная на моем собственном опыте.

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

+0

Хороший вопрос о системных цветах. Я не могу представить, что другие вещи часто необходимы для встроенных или мобильных устройств. – Mitch