QT6 源(155)模型视图架构里的列表视图 QListView:接着学习成员函数,信号函数,附上本类的源代码带注释。

(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)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值