Qt Quick TableViews 示例 - Pixelator
Pixelator 示例展示了如何使用 QML TableView 和代理来实现自定义表格模型。
运行示例
要从 Qt Creator 中运行示例,请打开 欢迎 模式并从 示例 中选择示例。有关更多信息,请参阅 构建和运行示例。
class ImageModel : public QAbstractTableModel { Q_OBJECT Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged) QML_ELEMENT public: ImageModel(QObject *parent = nullptr); QString source() const; void setSource(const QString &source); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant headerData(int /* section */, Qt::Orientation /* orientation */, int role) const override; signals: void sourceChanged(); private: QString m_source; QImage m_image; };
我们只需要一个简单的、只读的表格模型。因此,我们需要实现函数来指示图像的尺寸并向 TableView 提供数据。我们使用 Qt 属性系统 和一个源属性作为 QString
来设置图像的路径。我们还添加了 QML_ELEMENT 宏,以便将模型暴露给 QML。
void ImageModel::setSource(const QString &source) { if (m_source == source) return; beginResetModel(); m_source = source; m_image.load(m_source); endResetModel(); }
在此,当设置源路径时,我们加载图像。当源路径更改时,我们需要在之前调用 beginResetModel()
。图像加载后,我们需要调用 endResetModel()
。
int ImageModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; return m_image.height(); } int ImageModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; return m_image.width(); }
行和列数设置为图像的高度和宽度。
QVariant ImageModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || role != Qt::DisplayRole) return QVariant(); return qGray(m_image.pixel(index.column(), index.row())); }
此重载函数使我们能够从图像中访问像素数据。当我们使用显示角色调用此函数时,我们返回像素的灰度值。
Component { id: pixelDelegate Item { required property real display readonly property real gray: display / 255.0 readonly property real size: 16 implicitWidth: size implicitHeight: size
TableView
中的每个像素都通过代理组件显示。它包含一个条目,该条目具有隐式的高度和宽度,定义了表格的单元格大小。它还具有一个从模型中检索的像素灰度值属性。
Rectangle { id: rect anchors.centerIn: parent color: "#09102b" radius: parent.size - parent.gray * parent.size implicitWidth: radius implicitHeight: radius
在 Item
中,有一个根据像素的灰度值设置大小和半径的圆角 Rectangle
。
MouseArea { anchors.fill: parent hoverEnabled: true onEntered: rect.color = "#cecfd5" onExited: colorAnimation.start() }
为了增加一点交互,我们在 Item
中放置了一个 MouseArea
,并更改了矩形在鼠标悬停时的颜色。
ColorAnimation on color { id: colorAnimation running: false to: "#41cd52" duration: 1500 }
Rectangle
还具有当其颜色更改时在颜色之间淡出的短暂颜色动画。
TableView { id: tableView anchors.fill: parent model: ImageModel { source: ":/qt.png" } delegate: pixelDelegate }
TableView
覆盖整个窗口,并附加了我们的自定义 ImageModel
实例。
© 2024 Qt 公司。本文档中包含的文档贡献均为其各自所有者的版权。本文档根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款提供。Qt 和相应徽标是芬兰或世界其他国家的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。