我有一个QListView,它实现了一个自定义ListviewDelegate::paint来进行项目的自定义绘制。
我想知道是否可以创建一个定义矩形的qml文件,并将其用于绘制每个项目?与使用QPainter相比,这将给我一些在列表视图中创建外观不错的项目的自由。
看起来是可能的。使用以下代码,您可以将QML元素加载为QDeclarativeView。它是从QWidget派生的,所以你可以从你的deletegate中绘制这个小部件。
QDeclarativeView *qmlView = new QDeclarativeView;
qmlView->setSource(QUrl::fromLocalFile("myqml.qml"));
从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
}
}
}