Qt Qml в обычном приложении Qt - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть QListView с настраиваемым ListviewDelegate :: paint, реализованным для выполнения пользовательского рисования элементов.

Интересно, возможно ли создать файл qml, определяющий прямоугольник, и использовать его для рисования каждого элемента?Это дало бы мне некоторую свободу в создании достойно выглядящих элементов в моем списке просмотра по сравнению с использованием QPainter.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Получите из QDeclarativeItem и переопределите paint метод. Зарегистрируйте этот новый компонент с помощью qmlRegisterType и используйте его внутри своего делегата.

Не забудьте снять флажок QGraphicsItem::ItemHasNoContents в элементе пользовательского компонента.

Код компонента:

class CustomItem : public QDeclarativeItem
{
    Q_OBJECT
    Q_PROPERTY (int radius READ radius WRITE setRadius)
public:
    explicit CustomItem(QDeclarativeItem *parent = 0)
      : QDeclarativeItem(parent), m_radius(0)
    {
        setFlag(QGraphicsItem::ItemHasNoContents, false);
    }
    void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
    void setRadius(int r);
    int radius();
private:
    int m_radius;
};

Код средства просмотра (внутри основного, перед настройкой источника QML):

qmlRegisterType<CustomItem>("Self", 1,0, "CustomItem");

И код QML:

import QtQuick 1.1
import Self 1.0
ListView {
    model: ListModel {
        ListElement { name: "One";   value: 10 }
        ListElement { name: "Two";   value: 5 }
        ListElement { name: "Three"; value: 15 }
    }
    delegate: Column {
        Text {
            text: name
        }
        CustomItem {
            radius: value
        }
    }
}
1 голос
/ 23 февраля 2012

выглядит так, как это возможно. используя следующий код, вы можете загрузить элемент QML как QDeclarativeView. Который является производным от QWidget, так что вы можете нарисовать этот виджет из вашего deletegate.

 QDeclarativeView *qmlView = new QDeclarativeView;
 qmlView->setSource(QUrl::fromLocalFile("myqml.qml"));
...