(3)本类型除了属性,没有别的成员函数了。模型视图架构,把对数据的管理与对数据的显示分开,代码分散一下,反而更简单,更容易理解。QListView 是比列表窗体 QListViewWidget 更简单的,虽然前者是后者的父类。本类的公共成员函数,只有这三个 :
(4)本类的信号函数,只有这一个 ,关于移动,不想注释与测试,移动,似乎不是重要的操作 ::
(5)接着是一些重写基类中虚函数的 public 与 protected 成员函数,不再单独给出。本源代码定义于 qlistview . h 头文件 :
#ifndef QLISTVIEW_H
#define QLISTVIEW_H
#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qabstractitemview.h>
QT_REQUIRE_CONFIG(listview);
QT_BEGIN_NAMESPACE
class QListViewPrivate;
/*
The QListView class provides a list or icon view onto a model.
QListView展示存储在模型中的项,这些项可以呈现为简单的非层次列表,也可以是图标集合。
这个类用于提供先前由QListBox和QIconview类提供的列表和图标视图,
但采用了Qt模型/视图架构所提供的更为灵活的方式。
QListView 类是模型/视图类之一,并且是 Qt 模型/视图框架的一部分。
此视图不显示水平或垂直标题;
要以水平标题显示项目列表,请使用QTreeView。
QListView 实现了 QAbstractltemView类定义的接口,
以允许它显示从 QAbstractltemModel类派生的模型提供的数据。
列表视图中的项目可以使用两种视图模式之一来显示:
在“列表模式”中,项目以简单的列表形式显示;
在“图标模式”中,列表视图呈现为图标视图,其中项目以类似于文件管理器中文件的图标形式显示。
默认情况下,列表视图处于“列表模式”。
要更改视图模式,请使用“setViewMode()”函数,而要确定当前视图模式,请使用viewMode。
这些视图中的项按照列表视图中的 flow()指定的方向排列。
根据视图的 movement()状态,这些项可以是固定不动的,也可以是允许移动的。
如果模型中的项无法完全沿着流的方向排列,它们可以在视图小部件的边界处被包裹;
这取决于isWrapping()属性。当这些项由图标视图表示时,这个属性非常有用。
resizeMode()、和`layoutMode()属性决定了项的排列方式和排列时机。
项之间的间距由它们的`spacing()决定,并且可以存在于由`gridSize()、指定的概念性网格中。
根据它们的、iconSize()'属性,项可以被渲染为大图标或小图标。
Improving Performance :
可以向视图提供有关它正在处理的数据的提示,以便在显示大量项目时提高其性能。
对于旨在显示大小相等的项目的视图,可以采用的一种方法是将uniformltemSizes 属性设置为 true。
*/
class Q_WIDGETS_EXPORT QListView : public QAbstractItemView
{
Q_OBJECT
//此属性持有模型中可见的列。本列表视图即使匹配到表格模型,也只能显示表格中的某一列。
//默认情况下,此属性包含0,表示模型中的第一列将被显示。测试表示本属性只可以用代码来赋值。
Q_PROPERTY(int modelColumn READ modelColumn WRITE setModelColumn)
//This property holds which direction the items layout should flow.
//如果此属性为“从左到右”,则项目将按照从左到右的顺序排列。
//如果“isWrapping”属性为真,那么在到达可见区域的右侧时,布局将发生换行。
//如果此属性为“从上到下”,则项目将从可见区域的顶部开始排列,并在到达底部时发生换行。
//在视图可见时设置此属性将导致项目重新布局。默认情况下,此属性设置为TopToBottom。
//enum Flow { LeftToRight, TopToBottom };
Q_PROPERTY(Flow flow READ flow WRITE setFlow) //条目的展示方向,默认从上到下。
//enum ViewMode { ListMode, IconMode };
//此属性保存了QListView的视图模式。
//这个属性将改变其他未设置的属性,以与设置的视图模式保持一致。
//已经设置的0ListView特定属性将保持不变,除非调用了clearPropertyFlags()函数。
//设置视图模式将根据选定的移动方式启用或禁用拖放功能。
//对于“列表模式”,默认移动方式为“静态”(拖放功能被禁用)。
//对于“图标模式”,默认移动方式为“自由”(拖放功能被启用)。
Q_PROPERTY(ViewMode viewMode READ viewMode WRITE setViewMode)
Q_PROPERTY(LayoutMode layoutMode READ layoutMode WRITE setLayoutMode)
//enum LayoutMode { SinglePass, Batched };
//确定项目布局是立即进行还是延迟。这个属性存储了项目的布局模式。
//当模式为“单遍”(默认值)时,所有项目会一次性布局完毕。
//当模式为“批量”时,在处理事件期间,项目会以每批batchsize个项目的形式进行布局,
// 从而使得在布局其余项目的同时,用户能够即时查看并操作可见的项目。
Q_PROPERTY(int batchSize READ batchSize WRITE setBatchSize)
//如果布局模式设置为批次,则此属性表示每批放置的项目数量。 默认值为100。
//此属性表示列表视图中的所有项目是否具有相同大小。
//只有在确保视图中的所有项具有相同大小的情况下,才应将此属性设置为true。
//这有助于视图进行一些优化以提升性能。 默认情况下,此属性为false。
Q_PROPERTY(bool uniformItemSizes
READ uniformItemSizes WRITE setUniformItemSizes)
//此属性持有布局网格的大小. class QSize { int wd; int ht; };
//这个属性表示的是项目布局所在的网格大小。
//默认情况下是空大小,表示不存在网格,布局也不是在网格中完成的。
//将这个属性设置为非空大小,将启用网格布局。(当网格布局生效时,间距属性将被忽略。)
//在视图可见时设置此属性将导致项目重新布局。
Q_PROPERTY(QSize gridSize READ gridSize WRITE setGridSize) //默认为0*0
//此属性持有布局中项目周围的空格。By default, this property contains a value of 0.
//此属性是布局中项目周围填充的空闲空间大小。
//在视图可见时设置此属性将导致项目重新布局。
Q_PROPERTY(int spacing READ spacing WRITE setSpacing)
//此属性表示项目布局是否应换行。本属性描述的是模型内条目太多时是否换行。
//这个属性决定了在可见区域已无更多空间时,布局是否应进行换行。布局换行的位置取决于“流”属性。
//在视图可见时设置此属性将导致项目重新布局。 默认情况下,此属性为false。
Q_PROPERTY(bool isWrapping READ isWrapping WRITE setWrapping) //太多的条目是否允许曲折
Q_PROPERTY(bool wordWrap READ wordWrap WRITE setWordWrap) //默认太长的条目不换行。
//本属性描述的是当某条目内的文本太长时是否换行。
//This property holds the item text word-wrapping policy。//该属性默认情况下为假。
//如果此属性为真,则会在必要的词断处对项目文本进行换行处理;否则,文本将不会进行任何换行处理。
//请注意,即使启用了折叠功能,单元格也不会被扩展以留出空间容纳文本。
//对于无法显示的文本,会根据基类视图 QAbstractltemView的文本省略模式 textElideMode显示省略号。
//此属性表示每个项目在其单元格中的对齐方式。 //没啥用,咋设置都是一个效果。
//这仅在“列表模式”中,当采用“从上到下”流且启用“环绕” wrapping enabled时得到支持。
//默认对齐方式为0,这意味着项将完全填充其单元格。 0 不属于任何已知的枚举值。
Q_PROPERTY(Qt::Alignment itemAlignment READ itemAlignment WRITE setItemAlignment)
//enum QListView::Movement { Static, Free, Snap };
//此属性确定项目是否可以自由移动、是否与网格对齐,或完全无法移动。
//这个属性决定了用户如何能够移动视图中的项目。
//静态表示用户无法移动这些项目。free表示用户可以拖放项目到视图中的任何位置。
//snap表示用户可以拖放项目,但只能移动到由“gridSize”属性表示的假想网格中的位置。
//在视图可见时设置此属性将导致项目重新布局。默认情况下,此属性设置为Static。
Q_PROPERTY(Movement movement READ movement WRITE setMovement)
//经测试发现,设置gridSize属性后, grid 和 free 的显示的条目间距不一样。
//free与 snap的效果是相同的:拖动到目标上是替换操作;拖动到条目之间是插入操作。
//enum ResizeMode { Fixed, Adjust }; 默认情况下,此属性设置为固定。
//此属性表示在调整视图大小时,项目是否再次布局。
//如果此属性为“调整”,则在视图被调整大小时会重新布局项。
//如果该属性的值为“固定”,则在视图被调整大小时不会重新布局项。
Q_PROPERTY(ResizeMode resizeMode READ resizeMode WRITE setResizeMode)
//如果选择,矩形是否应该可见。 如果此属性为true,则选择矩形将可见;否则它将被隐藏。
//注:仅当选择模式处于可以选择多个项目的模式时,选择矩形才可见;
//即,如果选择模式为 QAbstractltemView::SingleSelection,则不会绘制选择矩形。
//若本属性为 F,则多选时仅选中条目中的内容,蓝底显示;
//若本属性为 T,则多选时会选中整行,整行都改为蓝底。
Q_PROPERTY(bool selectionRectVisible //默认情况下,此属性为false。
READ isSelectionRectVisible WRITE setSelectionRectVisible)
private:
int visualIndex(const QModelIndex & index) const;
//允许条目被移动,但取消了对视觉索引的获取。
friend class QCommonListViewBase;
Q_DECLARE_PRIVATE(QListView)
Q_DISABLE_COPY(QListView)
public:
enum Movement
{
Static, //The items cannot be moved by the user.
Free , //The items can be moved freely by the user.
Snap //The items snap快照 to the specified grid when moved; see setGridSize().
}; //移动时,项目会自动对齐到指定的网格。snap快照,折断;断裂;
Q_ENUM(Movement) //注册枚举类到元对象系统。
enum Flow { LeftToRight, TopToBottom };
Q_ENUM(Flow)
enum ResizeMode
{
Fixed, //The items will only be laid out the first time the view is shown
Adjust //The items will be laid out every time the view is resized.
};
Q_ENUM(ResizeMode)
enum LayoutMode
{
SinglePass, //The items are laid out all at once.
Batched //The items are laid out in batches of batchSize items.
}; //这些项目以批量大小的批次进行排列。 批次batch
Q_ENUM(LayoutMode)
enum ViewMode
{
ListMode, //The items are laid out using TopToBottom flow,
// with Small size and Static movement。从上到下排序。
IconMode //The items are laid out using LeftToRight flow,
// with Large size and Free movement。从左到右排序。
};
Q_ENUM(ViewMode)
explicit QListView(QWidget * parent = nullptr); //构造函数
~QListView();
// Q_PROPERTY(int modelColumn //默认显示模型里的第 0 列。
// READ modelColumn //测试表示本属性只可以用代码来赋值。
// WRITE setModelColumn)
int modelColumn() const;
void setModelColumn(int column);
// //enum Flow { LeftToRight, TopToBottom };
// Q_PROPERTY(Flow flow //条目的展示方向,默认从上到下 TopToBottom
// READ flow WRITE setFlow)
Flow flow() const;
void setFlow(Flow flow);
// //enum ViewMode { ListMode, IconMode };
// //对于“列表模式”,默认移动方式为“静态”(拖放功能被禁用)。
// //对于“图标模式”,默认移动方式为“自由”(拖放功能被启用)。
// Q_PROPERTY(ViewMode viewMode
// READ viewMode WRITE setViewMode)
ViewMode viewMode() const;
void setViewMode(ViewMode mode);
// //enum LayoutMode { SinglePass, Batched };
// Q_PROPERTY(LayoutMode layoutMode //“单遍”(默认值)
// READ layoutMode WRITE setLayoutMode)
LayoutMode layoutMode() const;
void setLayoutMode(LayoutMode mode);
// //如果布局模式设置为批次,则此属性表示每批放置的项目数量。 默认值为100。
// Q_PROPERTY(int batchSize
// READ batchSize WRITE setBatchSize)
int batchSize() const;
void setBatchSize(int batchSize);
// Q_PROPERTY(bool uniformItemSizes //默认情况下,此属性为false。
// READ uniformItemSizes WRITE setUniformItemSizes)
bool uniformItemSizes() const;
void setUniformItemSizes(bool enable);
// //此属性持有布局网格的大小. class QSize { int wd; int ht; };
// Q_PROPERTY(QSize gridSize
// READ gridSize WRITE setGridSize) //默认为0*0
QSize gridSize() const;
void setGridSize(const QSize & size);
// Q_PROPERTY(int spacing //条目周围的空格,默认值是 0
// READ spacing WRITE setSpacing)
int spacing() const;
void setSpacing(int space);
// Q_PROPERTY(bool isWrapping //本属性描述的是模型内条目太多时是否换行,默认false。
// READ isWrapping WRITE setWrapping) //太多的条目是否允许曲折
bool isWrapping() const;
void setWrapping(bool enable);
// Q_PROPERTY(bool wordWrap //本属性描述的是当某条目内的文本太长时是否换行。
// READ wordWrap WRITE setWordWrap) //默认太长的条目不换行。
bool wordWrap() const;
void setWordWrap(bool on);
// Q_PROPERTY(Qt::Alignment itemAlignment //默认值0:完全填充其单元格。
// READ itemAlignment //但0不是任何已知的枚举值。
// WRITE setItemAlignment)
Qt::Alignment itemAlignment() const;
void setItemAlignment(Qt::Alignment alignment);
// //enum QListView::Movement { Static, Free, Snap };
// Q_PROPERTY(Movement movement //默认情况下,此属性设置为Static。
// READ movement WRITE setMovement)
Movement movement() const;
void setMovement(Movement movement);
// //enum ResizeMode { Fixed, Adjust }; 默认情况下,此属性设置为固定。
// Q_PROPERTY(ResizeMode resizeMode
// READ resizeMode WRITE setResizeMode)
ResizeMode resizeMode() const;
void setResizeMode(ResizeMode mode);
// Q_PROPERTY(bool selectionRectVisible //如果选择,矩形是否应该可见。
// READ isSelectionRectVisible //默认情况下,此属性为false。
// WRITE setSelectionRectVisible)
bool isSelectionRectVisible() const;
void setSelectionRectVisible(bool show);
//清除QListView特定的属性标志。参见viewMode。
//从 QAbstractltemView继承的属性不被属性标志覆盖。
//具体来说,dragEnabled和acceptsDrops 在调用setMovement()或setViewMode()时由QListView计算。
void clearPropertyFlags();
//enum ViewMode { ListMode, IconMode };
bool isRowHidden(int row) const;
void setRowHidden(int row, bool hide);
Q_SIGNALS:
//This signal is emitted when the specified indexes are moved in the view.
void indexesMoved(const QModelIndexList & indexes);
public: //以下的成员函数,都是具体实现视图基类里的虚函数,不再注释了,详细注释在视图基类里。
QRect visualRect(const QModelIndex & index) const override;
void scrollTo(const QModelIndex & index,
ScrollHint hint = EnsureVisible) override;
QModelIndex indexAt(const QPoint & p) const override;
void doItemsLayout() override;
void reset() override;
void setRootIndex(const QModelIndex & index) override;
protected:
QListView(QListViewPrivate &, QWidget * parent = nullptr);
void scrollContentsBy(int dx, int dy) override;
void resizeContents (int width, int height);
QSize contentsSize() const;
QSize viewportSizeHint() const override;
void rowsInserted(const QModelIndex & parent, int start, int end) override;
void rowsAboutToBeRemoved(const QModelIndex & parent, int start, int end) override;
void startDrag(Qt::DropActions supportedActions) override;
void initViewItemOption(QStyleOptionViewItem *option) const override;
int horizontalOffset() const override;
int verticalOffset() const override;
QModelIndex moveCursor(CursorAction cursorAction,
Qt::KeyboardModifiers modifiers) override;
QRect rectForIndex(const QModelIndex & index) const;
void setPositionForIndex(const QPoint & position, const QModelIndex & index);
void setSelection(const QRect & rect,
QItemSelectionModel::SelectionFlags command) override;
QRegion visualRegionForSelection(const QItemSelection & selection) const override;
QModelIndexList selectedIndexes() const override;
void updateGeometries() override;
bool isIndexHidden(const QModelIndex & index) const override;
void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight,
const QList<int> & roles = QList<int>()) override;
void selectionChanged(const QItemSelection & selected,
const QItemSelection & deselected) override;
void currentChanged(const QModelIndex & current,
const QModelIndex & previous) override;
bool event(QEvent * e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void wheelEvent(QWheelEvent *e) override;
void timerEvent(QTimerEvent *e) override;
void resizeEvent(QResizeEvent *e) override;
void dragMoveEvent(QDragMoveEvent *e) override;
void dragLeaveEvent(QDragLeaveEvent *e) override;
void dropEvent(QDropEvent *e) override;
void paintEvent(QPaintEvent *e) override;
}; // 完结 class QListView : public QAbstractItemView
QT_END_NAMESPACE
#endif // QLISTVIEW_H
(6)
谢谢