QT6 源(156)模型视图架构里的列表窗体视图 QListWidget 的代码使用范例,及其条目类型 QListWidgetItem 的源代码

(1)生成如下窗体,其对应的 ui_widget . h 头文件如下,以此学习列表窗体的代码使用 :

在这里插入图片描述

++

#ifndef UI_WIDGET_H
#define UI_WIDGET_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QListWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_Widget
{
public:
    QVBoxLayout * verticalLayout;
    QPushButton * pushButton;
    QListWidget * listWidget;

    void setupUi(QWidget * Widget)
    {
        if (Widget->objectName().isEmpty())
            Widget->setObjectName(QString::fromUtf8("Widget"));
        Widget->resize(96, 108);
        QFont font;
        font.setPointSize(14);
        Widget->setFont(font);                //这一段是设置主窗体的,并给予了垂直布局。
        Widget->setContextMenuPolicy(Qt::CustomContextMenu);
        verticalLayout = new QVBoxLayout(Widget);
        verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));

        pushButton = new QPushButton(Widget); //把按钮加入到窗体布局中
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        verticalLayout->addWidget(pushButton);

        listWidget = new QListWidget(Widget); //生成带了元素的列表窗体,并加入垂直布局。
        new QListWidgetItem(listWidget);      //没有指针变量接收这三个堆区条目,
        new QListWidgetItem(listWidget);      //但顺带被加入了列表窗体容器。
        new QListWidgetItem(listWidget);
        listWidget->setObjectName(QString::fromUtf8("listWidget"));
        verticalLayout->addWidget(listWidget);

        retranslateUi(Widget);

        QMetaObject::connectSlotsByName(Widget); //允许信号与槽的名称连接。
    } // setupUi

    void retranslateUi(QWidget *Widget)
    {
        Widget    ->setWindowTitle(QCoreApplication::translate("Widget", "H", nullptr));

        pushButton->setText       (QCoreApplication::translate("Widget",
                                                                "pushButton", nullptr));

        const bool __sortingEnabled = listWidget->isSortingEnabled();

        listWidget->setSortingEnabled(false); //先取消列表窗体里对元素的布局要求,以便修改元素数据。
        QListWidgetItem * ___qlistwidgetitem = listWidget->item(0); //避免变量重名。
        ___qlistwidgetitem->setText(QCoreApplication::translate("Widget", "a", nullptr));

        QListWidgetItem * ___qlistwidgetitem1 = listWidget->item(1);
        ___qlistwidgetitem1->setText(QCoreApplication::translate("Widget", "b", nullptr));

        QListWidgetItem * ___qlistwidgetitem2 = listWidget->item(2);
        ___qlistwidgetitem2->setText(QCoreApplication::translate("Widget", "c", nullptr));

        listWidget->setSortingEnabled(__sortingEnabled); //恢复程序员对表格窗体设置的排序要求。

    } // retranslateUi

};

namespace Ui {
    class Widget: public Ui_Widget {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_WIDGET_H

(2)接着学习 列表窗体的元素类型 QListWidgetItem 。因为前面已经学习过表格窗体 QTableWidget 的元素类型 QTableWidgetItem。这些类型都大同小异。这里就不详细注释了。以下的举例都用上面的例子框架本类型也是可以被数据流类型接收的

在这里插入图片描述

(3) 接着学习本元素类 QListWidgetItem 的成员函数

在这里插入图片描述

(4)给出本 QListWidgetItem 类的源代码 , 定义于头文件 qlistwidget . h :

/*
The QListWidgetItem class provides an item for use with the QListWidget item view class.

Detailed Description :
QListWidgetltem 代表 QListWidget中的单个项目。每个项目可以包含几条信息,并会适当地显示它们。
项目视图便捷类采用经典的基于项目的接口,而非纯粹的模式/视图方法。
为了获得更灵活的列表视图小部件,可以考虑使用带有标准模型的 QListView 类。
列表项可以在构建时自动插入到列表中,通过指定列表小部件:
     new QListWidgetItem(tr("Hazel"), listWidget);

或者,列表项也可以在没有父小部件的情况下创建,并通过QListWidget::insertitem()方法插入到列表中。
列表项通常用于显示text()和icon()。这些是通过setText()和setlcon()函数设置的。
可以使用 setFont()、setForeground()和setBackground()自定义文本的外观。
可以使用 setTextAlignment()函数对齐列表项中的文本。
可以使用setToolTip()、setstatusTip()和setWhatsThis()将
    工具提示、状态提示和What's This?帮助添加到列表项中。

默认情况下,项目是启用的、可选的、可检查的,并且可以作为拖放操作的来源。
By default, items are enabled, selectable, checkable,
    and can be the source of drag and drop operations.

每个项目的标志可以通过调用setFlags ()函数并传入相应的值来更改(参见Qt:ltemFlags)。
可检查项目可以通过setcheckstate ()函数进行全选、全不选和部分选中。
相应的checkState() 函数则指示项目的当前选中状态。
isHidden()函数可用于确定项目是否被隐藏。要隐藏一个项目,请使用setHidden()。

Subclassing :
在通过子类化QListWidgetitem来提供自定义项时,可以为其定义新的类型,以便与标准项区分开来。
对于需要此功能的子类,请确保在构造函数中调用基类构造函数,传入一个等于或大于UserType的新类型值。

*/

class Q_WIDGETS_EXPORT QListWidgetItem
{
    friend class QListModel ;
    friend class QListWidget;

private:
    QListModel  * listModel() const; //因为不存在视图对应的模型了
    int                        rtti; //存储本条目的类型,可以是自定义类型,来自于构造函数中的 type。
    QListWidgetItemPrivate *   d   ; //数据成员在这里。但其是保密定义,没有源码。
    QListWidget            *   view; //记录本条目所属的列表窗体对象。

    Qt::ItemFlags         itemFlags; //记录本条目具有的操作属性。这是个对象型数据成员。

public:
    enum ItemType {
        Type     =    0,//The default type for list widget items.
        UserType = 1000 //The minimum value for custom types.
                        //  Values below UserType are reserved by Qt.
    };

    //Constructs an empty list widget item of the specified type with the given parent.
    //使用给定的父项构造指定类型的空列表小部件项。
    //如果未指定parent,则需要使用 QListWidget::insertItem()将该项目插入到列表小部件中。
    //此构造函数将项插入到传递给构造函数的父级的模型中。
    //如果模型已排序,则插入的行为是不确定的,因为模型将在此时尚未构造的项上调用"<"运算符方法。
    //为避免未确定的行为,我们建议不要指定父级,而是使用 QListWidget::insertltem().
    explicit    QListWidgetItem(QListWidget * listview = nullptr, int type = Type);
    //总之,不要为已排序的列表添加条目,应取消排序后,再添加条目。

    explicit    QListWidgetItem(const QString & text,
                                QListWidget   * listview = nullptr, int type = Type);
    explicit    QListWidgetItem(const QIcon   & icon,
                                const QString & text,
                                QListWidget   * listview = nullptr, int type = Type);

    QListWidgetItem(const QListWidgetItem & other); // copy构造函数

    QListWidgetItem & operator=(const QListWidgetItem & other); // copy赋值运算符函数

    virtual ~QListWidgetItem();  //析构函数
    
    virtual bool      operator<(const QListWidgetItem & other) const; //比较运算符
    
    virtual QListWidgetItem * clone() const; //Creates an exact copy of the item.

    inline  QListWidget     * listWidget() const { return view; }
    //Returns the list widget containing the item.

    bool   isSelected() const;
    void  setSelected(bool select);

    inline bool  isHidden() const
    {
        return
            (
                view
                ? view->isRowHidden(view->row(this))
                : false
            );
    }
    inline void setHidden(bool hide)
    {
        if (view)
            view->setRowHidden(view->row(this), hide);
    }


    inline  Qt::ItemFlags     flags() const { return itemFlags; }
    void                   setFlags(Qt::ItemFlags flags);

    inline int type() const { return rtti; }
    
    virtual void  read(QDataStream & in )      ; //与数据流之间的读写
    virtual void write(QDataStream & out) const;
    
    virtual QVariant    data(int role) const;
    virtual void     setData(int role, const QVariant & value);
    
//******************************************************************************    
//******************以下是读写本条目中存储的数据,按角色加以区分************************
//******************************************************************************     
    
    inline QString            text() const
    { return data(Qt::DisplayRole).toString(); }
    inline void            setText(const QString & text)
    { setData(Qt::DisplayRole, text); }

    inline QIcon              icon() const
    { return qvariant_cast<QIcon>(data(Qt::DecorationRole)); }
    inline void            setIcon(const QIcon   & icon)
    { setData(Qt::DecorationRole, icon); }

    inline QString            statusTip() const
    { return data(Qt::StatusTipRole).toString(); }
    inline void            setStatusTip(const QString & statusTip)
    { setData(Qt::StatusTipRole, statusTip); }

    inline QString            toolTip() const
    { return data(Qt::ToolTipRole).toString(); }
    inline void            setToolTip(const QString & toolTip)
    { setData(Qt::ToolTipRole, toolTip); }

    inline QString            whatsThis() const
    { return data(Qt::WhatsThisRole).toString(); }
    inline void            setWhatsThis(const QString & whatsThis)
    { setData(Qt::WhatsThisRole, whatsThis); }
    
    inline QFont              font() const
    { return qvariant_cast<QFont>(data(Qt::FontRole)); }
    inline void            setFont(const QFont & font)
    { setData(Qt::FontRole, font); }

    inline int                textAlignment() const
    { return data(Qt::TextAlignmentRole).toInt(); }
    inline void            setTextAlignment(int alignment)
    { setData(Qt::TextAlignmentRole, alignment); }

    inline QBrush             background() const
    { return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); }
    inline void            setBackground(const QBrush & brush)
    {   setData(Qt::BackgroundRole,
                brush.style() != Qt::NoBrush
                    ? QVariant(brush)
                    : QVariant());
    }

    inline QBrush             foreground() const
    { return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); }
    inline void            setForeground(const QBrush & brush)
    {   setData(Qt::ForegroundRole,
                brush.style() != Qt::NoBrush
                    ? QVariant(brush)
                    : QVariant());
    }

    inline Qt::CheckState     checkState() const
    { return static_cast<Qt::CheckState>(data(Qt::CheckStateRole).toInt()); }
    inline void            setCheckState(Qt::CheckState state)
    { setData(Qt::CheckStateRole, static_cast<int>(state)); }

    inline QSize              sizeHint() const
    { return qvariant_cast<QSize>(data(Qt::SizeHintRole)); }
    inline void            setSizeHint(const QSize & size)
    {
        setData(Qt::SizeHintRole,
                size.isValid()
                    ? QVariant(size)
                    : QVariant());
    }

}; //完结 class QListWidgetItem


Q_WIDGETS_EXPORT
QDataStream & operator<<(QDataStream & out, const QListWidgetItem & item);
Q_WIDGETS_EXPORT
QDataStream & operator>>(QDataStream & in,        QListWidgetItem & item);

(5)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhangzhangkeji

谢谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值