Qt 模型视图 - QListWidget(1)

1 简要

QListWidget是一个便利的类,是用于显示列表的控件。它提供了一个类似于QListView所提供的列表视图,具有用于添加和删除项的经典的基于项的接口,QListWidget的内部模型由QListWidgetItem来管理。

  • QListWidget的优势在于它易于使用,尤其是对于不熟悉模型-视图编程的开发人员来说,利用它可以快速构建一个列表窗口,并且可以支持多种操作,如复选框、图标等。
  • QListView类相比之下更加灵活,它不需要使用QListWidget类的那些额外功能,因此更加轻量级,可以更方便地自定义实现。QListView可以使用QAbstractItemModel类或其子类作为数据模型,可以自定义项的展示方式和交互。

开发环境

  • 系统:Window10
  • Qt版本:5.14.2
  • 编译器:MinGW_64

2 实现效果

在这里插入图片描述 在这里插入图片描述

3 实现步骤

3.1 创建一个自定义信息Item类

由于QListWidget类提供的函数只有添加QString、QListWidgetItem的项,无法满足自定义的需求。所以需要自定义一个继承自QWidget的信息类。并通过setItemWidget()函数将自己的类添加到Item里,这种方式的好处在于在Item里可以放很多不同的部件以及自定义布局等。

/**
 * @brief 自定义信息Item类
 */
class CustomizeItem : public QWidget
{
    Q_OBJECT
public:
    explicit CustomizeItem(QWidget *parent = nullptr);

    void setHeadPath(const QString &path);
    void setName(const QString &name);
    void setInfo(const QString &info);
    void setTime(const QString &time);

protected:
    bool eventFilter(QObject *watched, QEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;
    void contextMenuEvent(QContextMenuEvent *event) override;

private:
    void initForm();

private:
    QWidget *m_head;        // 头像
    QLabel  *m_name;        // 名称
    QLabel  *m_info;        // 信息
    QLabel  *m_time;        // 时间
    QString m_headPath;     // 头像路径
    QMenu *m_menu;          // 右键菜单
};

再源文件里使用窗口的菜单策略来实现右键菜单,以及通过事件过滤器对头像进行绘制操作(也可以直接用样式表)。

// CustomizeItem构造
CustomizeItem::CustomizeItem(QWidget *parent) : QWidget(parent)
{
    initForm();
    setContextMenuPolicy(Qt::DefaultContextMenu);
}

// 重写事件处理器函数 contextMenuEvent()
void CustomizeItem::contextMenuEvent(QContextMenuEvent *event)
{
    Q_UNUSED(event)
    m_menu->exec(QCursor::pos()); // 右键菜单被模态显示出来了
}

// 绘制头像
bool CustomizeItem::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == m_head) {
        if (event->type() == QEvent::Paint) {
            QPainter p(m_head);
            p.drawPixmap(m_head->rect(), QPixmap(m_headPath));
        }
    }
    return QWidget::eventFilter(watched, event);
}

3.2 在主窗口构造里添加

    for (int i = 0; i < 10; ++i) {
        CustomizeItem *item = new CustomizeItem(ui->listWidget);
//        item->setHeadPath(":/AlanYeager.jpg");
        item->setName("自定义Customize Item");
        item->setInfo("这是一个自定义Customize List Widget例子");
        item->setTime("04-26");

        QListWidgetItem *newItem = new QListWidgetItem;
        newItem->setSizeHint(QSize(ui->listWidget->width(), 70));
        ui->listWidget->insertItem(i, newItem);
        ui->listWidget->setItemWidget(newItem, item);
    }

3.3 样式表

QListWidget{
	background:white;
	color:black;
	border:none;
}
 
QListWidget::item{
	border:none;
}
 
QListWidget::item:hover{
    background:rgb(242,242,242)
}
 
QListWidget::item:selected{
	background:rgb(235,235,235);
}
 
QScrollBar:vertical {               
    background:transparent;
    width:9px;
    margin: 0px 0px 2px 0px;
}
 
QScrollBar::handle:vertical {
    background: rgb(215, 215, 215);
    min-height: 20px;
    border-radius: 3px;
}
 
QScrollBar::handle:vertical:hover{
    background:rgb(179, 179, 179);
}
 
QScrollBar::add-line:vertical {
    height: 0px;
    subcontrol-position: bottom;
    subcontrol-origin: margin;
}
 
QScrollBar::sub-line:vertical {
    height: 0px;
    subcontrol-position: top;
    subcontrol-origin: margin;
}

4 总结

  • 所以如果只需要简单的列表展示,可以选择QListWidget类,适用于界面简单、功能单一的场景。
  • 如果需要自定义的列表展示,并且需要处理复杂的交互和对数据源的操作,可以使用QListView类,适用于对灵活性和自定义能力要求较高的场景。
  • 注:虽然QListWidget提供了更多的功能和易用性,但也因此更加消耗内存和资源,相比之下QListView会更加轻量级,因此在大数据量或频繁操作数据的场景中,应该选择QListView以提高效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值