2012-02-22 5 views
0

У меня есть QListView с пользовательской реализацией ListviewDelegate :: для выполнения пользовательской покраски элементов.Qt Qml в обычном приложении Qt

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

ответ

1

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

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

Я попытался это, но qml, которые показаны, всего лишь белые. Содержимое не отображается –

+1

Не удалось увидеть вывод ошибки в окне вывода. Решила его и да, предметы показаны. –

1

проистекают из 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 
     } 
    } 
} 
+0

Разве это не обратное тому, что я спросил? Я хочу, чтобы в моем приложении QtGui загружать элемент QML и использовать его в качестве элемента для моего QListView? –

+0

Что такое Self 1.0 в Import Self 1.0? –

+0

Извините, я неправильно истолковал вопрос. «Я» - это произвольное имя модуля QML, используемое с 'qmlRegisterType'. – sergk