Qt Qml in a normal Qt application



我有一个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
        }
    }
}

最新更新