Qt制作一个ListView列表

一、概述

  案例:使用Qt制作一个ListView。点击ListView的Item可以用于测试OpenCV的各种效果

  自定义一个:MainListView继承QListWidget 、MainListViewItem继承QListWidgetItem

二、代码示例

  1.自定义QListWidget

  mainlistview.h

class MainListView : public QListWidget
{
    Q_OBJECT
public:
    explicit MainListView(QWidget *parent = nullptr);
protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void leaveEvent(QEvent *event);
private:
    QPoint startPoint;
    MainListViewItem *theHighlightItem = nullptr;
    MainListViewItem *oldHighlightItem = nullptr;
    MainListViewItem *theSelectedItem = nullptr;
    MainListViewItem *oldSelectedItem = nullptr;
    Chapter3Option * option = new Chapter3Option();


signals:


public slots:
    void updateSelectedIcon();
    void onMainItemClick(QListWidgetItem *item);
};

  mainlistview.cpp

#include "mainlistview.h"

MainListView::MainListView(QWidget *parent) : QListWidget(parent)
{
    setMouseTracking(true);
    //连接信号与槽函数,如果选中项发生变化则触发item图标的更新.都是当前对象发生
    connect(this,&MainListView::itemSelectionChanged,this,&MainListView::updateSelectedIcon);
    connect(this,&MainListView::itemClicked,this,&MainListView::onMainItemClick);
}

/**
 * 处理鼠标hove事件,item图标就变成hove状态
 * @brief MainListView::mouseMoveEvent
 * @param event
 */
void MainListView::mouseMoveEvent(QMouseEvent *event){
    oldHighlightItem = theHighlightItem;
    theHighlightItem = static_cast<MainListViewItem *>(itemAt(event->pos()));
    //旧的hover的item图标回复原状(条件是该item没有被选中)
    //新的hover的iten图标变成hover状态(条件是该item没有被选中)
    if(oldHighlightItem != theHighlightItem){
       if(oldHighlightItem && !oldHighlightItem->isSelected()) oldHighlightItem->setIcon(oldHighlightItem->mIcon);
       if(theHighlightItem && !theHighlightItem->isSelected()) theHighlightItem->setIcon(theHighlightItem->mIconHover);
    }
}

/**
 * 鼠标按下(这个可以当做item的点击事件,能够正常执行)
 * @brief MainListView::mousePressEvent
 * @param event
 */
void MainListView::mousePressEvent(QMouseEvent *event){
    if(event->buttons()&Qt::LeftButton){
        startPoint = event->pos();
        MainListViewItem *item = static_cast<MainListViewItem *>(itemAt(event->pos()));
        QString filePath = QFileDialog::getOpenFileName(this, tr("选择视频"), "C:\\Users\\wei.yang\\Downloads\\opencv_res", tr("Image Files(*.jpg *.png)"));
        const char
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是实现好看的ListView收音频道列表的步骤: 1. 自定义Model 首先,我们需要自定义一个Model来提供数据。我们可以继承自QAbstractListModel类,在data()函数中返回每个音频频道的名称和图标。 ```cpp class AudioListModel : public QAbstractListModel { public: AudioListModel(QObject *parent = nullptr); // 重写QAbstractListModel虚函数 int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; private: QList<QString> m_channelNames; // 音频频道名称 QList<QPixmap> m_channelIcons; // 音频频道图标 }; ``` 2. 自定义Delegate 我们需要自定义一个Delegate来绘制每个音频频道的样式。我们可以继承自QStyledItemDelegate类,在paint()函数中绘制每个音频频道的名称和图标。 ```cpp class AudioListDelegate : public QStyledItemDelegate { public: AudioListDelegate(QObject *parent = nullptr); // 重写QStyledItemDelegate虚函数 void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; ``` 3. 创建ListView并应用Model和Delegate 最后,我们可以在主窗口中创建一个ListView,然后将自定义的Model和Delegate应用于ListView,这样就能够以好看的方式展示音频频道列表了。 ```cpp // 创建ListView QListView *listView = new QListView(this); // 创建Model和Delegate AudioListModel *model = new AudioListModel(this); AudioListDelegate *delegate = new AudioListDelegate(this); // 将Model和Delegate应用于ListView listView->setModel(model); listView->setItemDelegate(delegate); ``` 以上就是实现好看的ListView收音频道列表的步骤。具体实现可以根据需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值