2016-01-11 4 views
2

При создании QML QQuickItems из кода C++ можно ли получить доступ/изменить anchors?Возможно ли получить доступ к якорям QML из C++?

Все anchors свойства указаны как Q_PRIVATE_PROPERTY в QQuickItem, и я не вижу способа, который мог бы помочь.

Возможно, мне нужно ввести anchors с помощью сигналов/событий и QLayout?

Что я должен был бы, например,:

Rectangle { 
    // ... 
    anchors.bottom: parent.bottom 
    anchors.bottomMargin: 0 
    anchors.top: parent.top 
    anchors.topMargin: 0 
    anchors.right: parent.right 
    anchors.rightMargin: -10 
    // ... 
} 

ответ

1

На самом деле существует класс для якорей. А именно QQuickAnchors, расположенный в QtQuick/private/qquickanchors_p_p.h, и их обработка относится к QQuickItemPrivate. Но поскольку оба класса не являются частью общедоступного API, anwer: Нет, вы не можете получить доступ или модифицировать привязки из C++.

Я бы рассмотрел этот хороший дизайн API, а не ограничение. Это заставляет вас управлять визуальными свойствами в QML, где они принадлежат. Поэтому вместо того, чтобы создавать компоненты QML из C++ через new QQmlComponent(), я бы рекомендовал использовать зарегистрированные пользовательские типы непосредственно в QML (который может выполняться статически или динамически с помощью Repeater и/или Loader компонентов), откуда вы можете получить Itemanchors и все другие визуальные свойства.

+0

Если, как вы говорите, это «хороший дизайн API», расскажите мне, как я должен: 1) создать компонент QML с настраиваемыми свойствами (в настоящее время я наследую QQuickItem для добавления таких свойств => C++) и 2), в то же время необходимо определить пользовательский макет QQuickItem - например добавив изображение, загруженное w/fill, что лучше всего сделать из QML –

+0

@ Zuzel Ну, это не о «как я говорю». Речь идет о том, как Qt решил это с точки зрения дизайна API. Честно говоря, я не могу думать о ситуации, когда настройка атрибутов макета в QML просто недостаточна. Если у вас есть конкретная проблема, попробуйте задать вопрос – qCring

+0

. Я думал, что просто задал вопрос и описал конкретную проблему.Да, это их дизайн явно, и вы просто сказали, что рассматриваете этот конкретный случай как один из «хороших» примеров дизайна API. Я утверждал, что, наоборот, это пример дизайна _crappy_ API. –

0

Для якорей, связанных с родительским элементом, я нашел следующее в качестве решения проблемы «установки anchors.fill: parent из C++», которая возникает, когда у вас нет возможности создавать пользовательские типы в QML (например, вы должны предоставить чистый API для создания QML объектов динамически):

class MyItem : public QQuickItem { 
    Q_OBJECT 

public: 
    explicit MyItem(QQuickItem* parent){ 
     if(parent){ 
      connect(parent, SIGNAL(widthChanged()), this, SLOT(parentWidthChanged())); 
      connect(parent, SIGNAL(heightChanged()), this, SLOT(parentHeightChanged())); 
      setWidth(parent->width()); 
      setHeight(parent->height()); 
     } 
     else 
      qWarning() << "MyItem must be initialized with a parent."; 
    } 

private slots: 
    void parentWidthChanged(){ 
     setWidth(parentItem()->width()); 
    } 
    void parentHeightChanged(){ 
     setHeight(parentItem()->height()); 
    } 
}; 

Аналогичная логика может следовать, чтобы подражать anchors.top, anchors.bottom и т.д., и связанных с ними полей вручную расчета, setX() и setY() также может потребоваться для достижения этой цели.

0

В отличие от предыдущих ответов, это возможно и имеет допустимые варианты использования. Все объекты Qt, даже частные, имеют API интроспекции. Эти API, которые вы используете с движком QML. Они также могут использоваться с C++:

qvariant_cast<QObject*>(
    item->property("anchors") 
)->setProperty("top", otherItem->property("bottom")); 

Обратите внимание, что есть условие гонки, потому что задействованы некоторые потоки.

QML поддерживает только списки моделей. Отображение других структур, таких как деревья или таблица, либо плохо реализовано (QtQuickControls 1.x), либо разумно неэффективно (рекурсивные повторители). Для некоторых структур данных C++ также является единственным способом корректной реализации ленивой загрузки. QML Loader проделайте длинный путь, но не полностью.

+1

Не могли бы вы поделиться своим действительным прецедентом? Код C++, основанный на QML-коде, не так уж хорош. Хотя одно место, где это имеет смысл, - это тесты. – Mitch

+0

Расширенные раскладки на основе 'QQuickItem'. QtQuick всегда предполагает, что данные (модели) являются списком. Другие структуры, такие как таблицы, диаграммы, графики, карты и деревья, не поддерживаются встроенными оптимизациями контейнеров. Конечно, их можно представить в любом случае, но они не масштабируются. Некоторые макеты, такие как «ListView», встроены в код C++ для оптимизации ленивых/асинхронных сценариев загрузки. Этот код необходимо воспроизвести, чтобы получить эквивалентную производительность от других структур. Код имеет доступ к частным API-интерфейсам Qt, у нас нет (если вы не включили его, но это намного хуже, чем использование API интроспекции). –

Смежные вопросы