当前位置:   article > 正文

C++ | Qt 实现自定义QListWidgetItem效果_qlistwidget自定义item

qlistwidget自定义item

目录

一、使用Qt自带QListWidgetItem

1.使用方式

2.效果

二、 自定义Item

1.效果

2.实现

三、补充【2021/08/30】


一、使用Qt自带QListWidgetItem

1.使用方式

  1. ui->listWidget->setViewMode(QListView::IconMode);
  2. ui->listWidget->setGridSize(QSize(64,90));
  3. //设置QListWidget中单元项的图片大小
  4. ui->listWidget->setIconSize(QSize(45,45));
  5. //设置QListWidget中单元项的间距
  6. ui->listWidget->setSpacing(0);
  7. //设置自动适应布局调整(Adjust适应,Fixed不适应),默认不适应
  8. ui->listWidget->setResizeMode(QListWidget::Adjust);
  9. //设置不能移动
  10. ui->listWidget->setMovement(QListWidget::Static);
  11. ui->listWidget->setStyleSheet("QListWidget::Item:hover{background-color:rgba(47,46,46,0);border-radius:5px; }"
  12. "QListWidget::item:selected{background-color:rgba(47,46,46,0);color:rgb(61,61,61);border:2px solid #FFC53D;border-radius:5px; }"
  13. "QScrollBar:vertical{width:6px}");
  14. ui->listWidget->setFocusPolicy(Qt::NoFocus);//文字没虚线
  15. ui->listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
  16. connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(listWidgetClicked(QListWidgetItem*)));
  17. for(int i=0;i<10;i++)
  18. {
  19. QListWidgetItem* item=new QListWidgetItem();
  20. item->setIcon(QIcon(iconPath));
  21. item->setText(effectName);
  22. ui->listWidget->addItem(item);
  23. }

2.效果

Qt中QListWidgetItem对象中有Icon及Text属性,也就是说Item是一个组合体,Icon和Text是Item的一部分,我们没有办法对Icon单独设置样式(如边框)。

从下方图片可以看到,当选中某个Item时,其Icon会变成淡蓝色,而且,添加的border是争对Item整个物体而言。所以如何实现选中某个Item时,其Icon不会变色,而是在Icon周围添加一个黄色边框呢?这就需要我们自定义Item。

二、 自定义Item

1.效果

2.实现

1.创建Item UI。新建文件Qt 设计师界面类,继承自Widget,取名为mywidgetitem.ui。布局如下:

2.在mywidgetitem.h文件中声明以下三个函数:

  1. //初始化Item,设置text及icon
  2. void Init(QString text,QString iconPath);
  3. //item被选中
  4. void OnSelect();
  5. //item非选中
  6. void OnRelease();

3.在mywidgetitem.cpp中实现以上三个函数:

  1. void MyWidgetItem::Init(QString text, QString iconPath)
  2. {
  3. ui->label->setText(text);
  4. QPixmap pixmapPic(iconPath);
  5. QPixmap pixmapPicFit = pixmapPic.scaled(45, 45, Qt::IgnoreAspectRatio);
  6. ui->icon->setPixmap(pixmapPicFit);
  7. }
  8. void MyWidgetItem::OnSelect()
  9. {
  10. ui->icon->setStyleSheet("border:2px solid yellow;"
  11. " border-radius:25px;");
  12. }
  13. void MyWidgetItem::OnRelease()
  14. {
  15. ui->icon->setStyleSheet("border:2px solid rgb(240, 242, 245);"
  16. " border-radius:25px; ");
  17. }

4.mywidgetitem的应用。在mainwindow.h文件中添加变量用来记录上次点击的item:

    QListWidgetItem *lastItem=nullptr;

5.在mainwindow.ui中创建一个ListWidget,在mainwindow.cpp文件中实现效果:

【重要代码:第24-26行】

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QDebug>
  4. MainWindow::MainWindow(QWidget *parent)
  5. : QMainWindow(parent)
  6. , ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. ui->listWidget->setViewMode(QListView::IconMode);
  10. //设置QListWidget中单元项的间距
  11. ui->listWidget->setSpacing(0);
  12. //设置自动适应布局调整(Adjust适应,Fixed不适应),默认不适应
  13. ui->listWidget->setResizeMode(QListWidget::Adjust);
  14. //设置不能移动
  15. ui->listWidget->setMovement(QListWidget::Static);
  16. for(int i=0;i<10;i++)
  17. {
  18. QListWidgetItem *item=new QListWidgetItem(ui->listWidget);
  19. item->setSizeHint(QSize(85, 85));
  20. ui->listWidget->addItem(item);
  21. MyWidgetItem *widgetItem=new MyWidgetItem();
  22. widgetItem->Init("名称","icon路径");
  23. ui->listWidget->setItemWidget(item,widgetItem);
  24. }
  25. }
  26. void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
  27. {
  28. static_cast<MyWidgetItem*>(ui->listWidget->itemWidget(item))->OnSelect();
  29. if(lastItem!=nullptr)
  30. {
  31. static_cast<MyWidgetItem*>(ui->listWidget->itemWidget(lastItem))->OnRelease();
  32. }
  33. lastItem=item;
  34. }

三、补充【2021/08/30】

当我要实现item的选中/取消时(即第一次点击选中item,再次点击取消选择),当我操作过快时,on_listWidget_itemClicked()有时候并不会触发,这是因为操作过快时,触发了双击事件,所以我们要把双击事件屏蔽掉。

重写event事件:可参考Qt事件

bool event(QEvent *event) override;
  1. bool MyListWidgetItem::event(QEvent *event)
  2. {
  3. if(event->type()==QEvent::MouseButtonDblClick)
  4. {
  5. return true;
  6. }
  7. return QWidget::event(event);
  8. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/764786
推荐阅读
  

闽ICP备14008679号