0


Qt之列表的使用(QListView、QListWidget)

QListView

将存储在模型中的项显示为简单的非层次列表或图标集合

常用方法:
void setModel(QAbstractItemModel *model) //设置模型
void setMovement(Movement movement) //设置数据是否可以任意拖动 QListView::Static:用户无法移动项目 QListView::Free //用户可以自由移动项目 QListView::Snap 用户可以自由移动项目,移动时项目会捕捉到指定的网格
void setSpacing(int space) //设置数据间距
自定义QListView:
继承QAbstractListModel,自定义model
继承QStyledItemDelegate,自定义Delegate

QListWidget

是“简易版”的 QListView,创建和使用列表的方式更简单、门槛更低,只能创建结构简单的列表,如果要制作复杂的列表,应优先考虑 QListView
在数据多的时候,QListWidget性能会降低
QListWidgetItem的子类,用于实现自定义的item
常用方法:
void addItem(const QString &label);//添加项
void addItem(QListWidgetItem *item);
QListWidgetItem *currentItem() const;//当前项
QListWidgetItem *takeItem(int row);//获取后删除该项
void insertItem(int row, QListWidgetItem *item);
void insertItem(int row, const QString &label);

自定义QListWidget:
继承widget,自定义widget
通过setItemWidget设置

代码

widgetlist.h

  1. #ifndef WIDGETLIST_H
  2. #define WIDGETLIST_H
  3. #include <QWidget>
  4. #include <QStringListModel>
  5. #include "customlistview.h"
  6. namespace Ui {
  7. class WidgetList;
  8. }
  9. class WidgetList : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit WidgetList(QWidget *parent = nullptr);
  14. ~WidgetList();
  15. //ListView
  16. void initListView();
  17. //自定义ListView
  18. void initCustomListView();
  19. //ListWidget
  20. void initListWidget();
  21. //自定义ListWidget
  22. void initCustomListWidget();
  23. void addCustomListWidgetItem(const QString& sName, const QString& sDes, const QString& sPic);
  24. protected:
  25. void changeEvent(QEvent* event);
  26. private slots:
  27. //ListView
  28. void on_btn_listview_get_clicked();
  29. void on_btn_listview_delete_clicked();
  30. void on_btn_listview_set_clicked();
  31. void on_btn_listview_add_clicked();
  32. //ListWidget
  33. void on_btn_listwidget_get_clicked();
  34. void on_btn_listwidget_delete_clicked();
  35. void on_btn_listwidget_set_clicked();
  36. void on_btn_listwidget_add_clicked();
  37. private:
  38. void retranslateUi();
  39. private:
  40. QStringListModel *m_pModel; //该数据模型,只能用于字符串
  41. //自定义ListView
  42. CustomListViewModel *m_pCustomModel;
  43. CustomListViewDelegate *m_pCusDelegate;
  44. private:
  45. Ui::WidgetList *ui;
  46. };
  47. #endif // WidgetList_H

widgetlist.cpp

  1. #include "widgetlist.h"
  2. #include "ui_widgetlist.h"
  3. #include "commondef.h"
  4. #include <QDateTime>
  5. #include <QStandardItem>
  6. #include "customlistwidgetitem.h"
  7. WidgetList::WidgetList(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::WidgetList)
  10. {
  11. ui->setupUi(this);
  12. retranslateUi();
  13. initListView();
  14. initListWidget();
  15. initCustomListView();
  16. initCustomListWidget();
  17. }
  18. WidgetList::~WidgetList()
  19. {
  20. delete ui;
  21. }
  22. /*************************
  23. * QListView-初始化
  24. * ***********************/
  25. void WidgetList::initListView()
  26. {
  27. //1.创建数据显示列表
  28. QStringList list;
  29. for(int i = 0; i < 5; ++i)
  30. {
  31. list.append(QString("Item_%1").arg(i+1));
  32. }
  33. //2.使用数据列表创建数据显示模型
  34. m_pModel = new QStringListModel(list);
  35. //3.设置模型
  36. ui->listView->setModel(m_pModel);
  37. ui->listView->setMovement(QListView::Free);//设置数据可以自由拖动
  38. ui->listView->setSpacing(2);//设置数据间隔
  39. }
  40. /*************************
  41. * QListView-插入函数
  42. * ***********************/
  43. void WidgetList::on_btn_listview_add_clicked()
  44. {
  45. QString str = ui->lineEdit->text();
  46. if(str.isEmpty())
  47. {
  48. MY_DEBUG << "The content of lineEdit is empty";
  49. return;
  50. }
  51. //1.获取行数
  52. int row = m_pModel->rowCount();
  53. //2.插入新行
  54. m_pModel->insertRow(row);
  55. //3.获取插入行的索引index
  56. QModelIndex index = m_pModel->index(row);
  57. //4.通过index设置数据
  58. m_pModel->setData(index, str);
  59. //5.设置到当前index
  60. ui->listView->setCurrentIndex(index);
  61. }
  62. /*************************
  63. * QListView-删除函数
  64. * ***********************/
  65. void WidgetList::on_btn_listview_delete_clicked()
  66. {
  67. //1.获取当前的index
  68. QModelIndex index = ui->listView->currentIndex();
  69. if(-1 == index.row())
  70. {
  71. MY_DEBUG << "No Select One Item";
  72. return;
  73. }
  74. //2.根据index删除行
  75. m_pModel->removeRow(index.row());
  76. }
  77. /*************************
  78. * QListView-修改函数
  79. * ***********************/
  80. void WidgetList::on_btn_listview_set_clicked()
  81. {
  82. QString str = ui->lineEdit->text();
  83. if(str.isEmpty())
  84. {
  85. MY_DEBUG << "The content of lineEdit is empty";
  86. return;
  87. }
  88. //1.获取当前的index
  89. QModelIndex index = ui->listView->currentIndex();
  90. if(-1 == index.row() || str.isEmpty())
  91. {
  92. return;
  93. }
  94. //2.通过index设置数据
  95. m_pModel->setData(index, str);
  96. }
  97. /*************************
  98. * QListView-获取函数
  99. * ***********************/
  100. void WidgetList::on_btn_listview_get_clicked()
  101. {
  102. //1.获取当前index
  103. QModelIndex index = ui->listView->currentIndex();
  104. if(-1 == index.row())
  105. {
  106. MY_DEBUG << "No Select One Item";
  107. return;
  108. }
  109. //2.获取当前index的值
  110. ui->lineEdit->setText(index.data(Qt::DisplayRole).toString());
  111. }
  112. /*************************
  113. * QListView自定义-初始化
  114. * ***********************/
  115. void WidgetList::initCustomListView()
  116. {
  117. m_pCustomModel = new CustomListViewModel();
  118. for (int i = 0; i < 5; ++i)
  119. {
  120. CUSTOM_DATA data;
  121. data.m_bCheck = (i%2==0);
  122. data.m_sDes = QString("Item_%1").arg(QString::number(i+1));
  123. m_pCustomModel->insertData(data);
  124. }
  125. m_pCusDelegate = new CustomListViewDelegate();
  126. ui->listView_2->setModel(m_pCustomModel);
  127. ui->listView_2->setItemDelegate(m_pCusDelegate);
  128. ui->listView_2->setMouseTracking(true);
  129. }
  130. /
  131. /*************************
  132. * QListWidget-初始化
  133. * ***********************/
  134. void WidgetList::initListWidget()
  135. {
  136. for(int i = 0; i <5; ++i)
  137. {
  138. //1.使用addItem添加数据
  139. ui->listWidget->addItem(tr("Item_") + QString::number(i+1));
  140. }
  141. }
  142. /*************************
  143. * QListWidget-添加函数
  144. * ***********************/
  145. void WidgetList::on_btn_listwidget_add_clicked()
  146. {
  147. QString str = ui->lineEdit_2->text();
  148. if(str.isEmpty())
  149. {
  150. MY_DEBUG << "The content of lineEdit is empty";
  151. return;
  152. }
  153. ui->listWidget->addItem(str);
  154. }
  155. /*************************
  156. * QListWidget-删除函数
  157. * ***********************/
  158. void WidgetList::on_btn_listwidget_delete_clicked()
  159. {
  160. //1.判断当前项currentItem()
  161. if(ui->listWidget->currentItem() != Q_NULLPTR)
  162. {
  163. //2.使用takeItem删除当前行
  164. QListWidgetItem* Item = ui->listWidget->takeItem(ui->listWidget->currentRow());
  165. delete Item;
  166. }
  167. }
  168. /*************************
  169. * QListWidget-修改函数
  170. * ***********************/
  171. void WidgetList::on_btn_listwidget_set_clicked()
  172. {
  173. QString str = ui->lineEdit_2->text();
  174. if(str.isEmpty())
  175. {
  176. MY_DEBUG << "The content of lineEdit is empty";
  177. return;
  178. }
  179. //1.判断当前项currentItem()
  180. if(ui->listWidget->currentItem() != Q_NULLPTR)
  181. {
  182. //2.设置当前项内容
  183. ui->listWidget->currentItem()->setText(str);
  184. }
  185. }
  186. /*************************
  187. * QListWidget-获取函数
  188. * ***********************/
  189. void WidgetList::on_btn_listwidget_get_clicked()
  190. {
  191. //1.判断当前项currentItem()
  192. if(ui->listWidget->currentItem() != Q_NULLPTR)
  193. {
  194. //2.获取当前项数据
  195. QListWidgetItem* Item = ui->listWidget->currentItem();
  196. ui->lineEdit_2->setText(Item->data(Qt::DisplayRole).toString());
  197. }
  198. }
  199. /*************************
  200. * QListWidget自定义-初始化
  201. * ***********************/
  202. void WidgetList::initCustomListWidget()
  203. {
  204. ui->listWidget_2->setResizeMode(QListView::Adjust);
  205. ui->listWidget_2->setViewMode(QListView::IconMode);
  206. for(int i = 0; i < 5; ++i)
  207. {
  208. addCustomListWidgetItem(QString("Item_%1").arg(i+1),
  209. QString("Item_Des_%1").arg(i+1),
  210. QString(":/Resource/Image/WidgetList/person.jpg"));
  211. }
  212. }
  213. /*************************
  214. * QListWidget自定义-添加
  215. * ***********************/
  216. void WidgetList::addCustomListWidgetItem(const QString &sName, const QString &sDes, const QString &sPic)
  217. {
  218. //1.设置CustomItem数据
  219. CustomListWidgetItem *pCustomItem = new CustomListWidgetItem(this);
  220. pCustomItem->SetData(sName, sDes, sPic);
  221. //2.添加QListWidgetItem
  222. QListWidgetItem* pItem = new QListWidgetItem();
  223. pItem->setSizeHint(QSize(350, 40));
  224. ui->listWidget_2->addItem(pItem);
  225. //3.通过setItemWidget设置Item
  226. ui->listWidget_2->setItemWidget(pItem, pCustomItem);
  227. }
  228. /
  229. /*************************
  230. * 语言翻译处理
  231. * ***********************/
  232. void WidgetList::changeEvent(QEvent *event)
  233. {
  234. switch(event->type())
  235. {
  236. case QEvent::LanguageChange:
  237. retranslateUi();
  238. break;
  239. default:
  240. QWidget::changeEvent(event);
  241. }
  242. }
  243. void WidgetList::retranslateUi()
  244. {
  245. ui->label->setText(tr("Use List View"));
  246. ui->label_2->setText(tr("Use List Widget"));
  247. ui->label_3->setText(tr("Use Custom List View"));
  248. ui->label_4->setText(tr("Use Custom List Widget"));
  249. ui->btn_listview_add->setText(tr("Add"));
  250. ui->btn_listview_set->setText(tr("Set"));
  251. ui->btn_listview_delete->setText(tr("Delete"));
  252. ui->btn_listview_get->setText(tr("Get"));
  253. ui->btn_listwidget_add->setText(tr("Add"));
  254. ui->btn_listwidget_set->setText(tr("Set"));
  255. ui->btn_listwidget_delete->setText(tr("Delete"));
  256. ui->btn_listwidget_get->setText(tr("Get"));
  257. }

customlistview.h

  1. #ifndef CUSTOMLISTVIEW_H
  2. #define CUSTOMLISTVIEW_H
  3. #include <QAbstractListModel>
  4. #include <QStyledItemDelegate>
  5. #include <QListView>
  6. #include <QPainter>
  7. #include <QMouseEvent>
  8. //自定义数据
  9. typedef struct CUSTOM_DATA_T
  10. {
  11. bool m_bCheck;
  12. QString m_sDes;
  13. }CUSTOM_DATA;
  14. Q_DECLARE_METATYPE(CUSTOM_DATA)
  15. //自定义模型
  16. class CustomListViewModel : public QAbstractListModel
  17. {
  18. Q_OBJECT
  19. public:
  20. CustomListViewModel();
  21. ~CustomListViewModel();
  22. //插入数据
  23. void insertData(CUSTOM_DATA data);
  24. //获取总行数
  25. int rowCount(const QModelIndex &parent) const;
  26. //获取当前行数据
  27. QVariant data(const QModelIndex &index, int role) const;
  28. //设置当前行数据
  29. bool setData(const QModelIndex &index, const QVariant &value, int role);
  30. private:
  31. QList<CUSTOM_DATA> m_ListData;
  32. };
  33. //自定义模型视图-用于数据项目的显示和编辑
  34. class CustomListViewDelegate : public QStyledItemDelegate
  35. {
  36. Q_OBJECT
  37. public:
  38. CustomListViewDelegate();
  39. ~CustomListViewDelegate();
  40. //描绘画面显示
  41. void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
  42. //处理鼠标事件
  43. bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
  44. };
  45. #endif // CUSTOMLISTVIEW_H

customlistview.cpp

  1. #include "customlistview.h"
  2. #include "commondef.h"
  3. CustomListViewModel::CustomListViewModel()
  4. {
  5. }
  6. CustomListViewModel::~CustomListViewModel()
  7. {
  8. }
  9. /*************************
  10. * CustomListViewModel-插入数据
  11. * ***********************/
  12. void CustomListViewModel::insertData(CUSTOM_DATA data)
  13. {
  14. m_ListData.push_back(data);
  15. }
  16. /*************************
  17. * CustomListViewModel-获取总行数
  18. * ***********************/
  19. int CustomListViewModel::rowCount(const QModelIndex &parent) const
  20. {
  21. return m_ListData.size();
  22. }
  23. /*************************
  24. * CustomListViewModel-获取当前行数据
  25. * ***********************/
  26. QVariant CustomListViewModel::data(const QModelIndex &index, int role) const
  27. {
  28. QVariant ret;
  29. int row = index.row();
  30. if(row >= m_ListData.size() || (!index.isValid()))
  31. {
  32. return QVariant();
  33. }
  34. CUSTOM_DATA tmpData = m_ListData.at(row);
  35. // 下面的role要和setData中的role一一对应;
  36. switch(role)
  37. {
  38. case Qt::UserRole+1:
  39. ret = tmpData.m_bCheck;
  40. break;
  41. case Qt::UserRole+2:
  42. ret = tmpData.m_sDes;
  43. break;
  44. default :
  45. break;
  46. }
  47. return ret;
  48. }
  49. /*************************
  50. * CustomListViewModel-设置当前行数据
  51. * ***********************/
  52. bool CustomListViewModel::setData(const QModelIndex &index, const QVariant &value, int role)
  53. {
  54. bool bRet = false;
  55. int nRow = index.row();
  56. if(nRow >= m_ListData.size() || (!index.isValid()))
  57. {
  58. return false;
  59. }
  60. CUSTOM_DATA tmpData = m_ListData.at(nRow);
  61. switch(role)
  62. {
  63. case Qt::UserRole+1:
  64. tmpData.m_bCheck = value.toBool();
  65. bRet = true;
  66. break;
  67. case Qt::UserRole+2:
  68. tmpData.m_sDes = value.toString();
  69. bRet = true;
  70. break;
  71. default :
  72. break;
  73. }
  74. m_ListData.replace(nRow, tmpData);
  75. return bRet;
  76. }
  77. CustomListViewDelegate::CustomListViewDelegate()
  78. {
  79. }
  80. CustomListViewDelegate::~CustomListViewDelegate()
  81. {
  82. }
  83. /*************************
  84. * CustomListViewDelegate-绘制事件,用于显示
  85. * ***********************/
  86. void CustomListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
  87. {
  88. QRect rect = option.rect;
  89. //取数据
  90. bool bCheck = index.data(Qt::UserRole+1).toBool();
  91. QString sDes = index.data(Qt::UserRole+2).toString();
  92. QStyleOptionViewItem viewoption(option);
  93. initStyleOption(&viewoption, index);
  94. if(option.state.testFlag(QStyle::State_HasFocus))
  95. {
  96. viewoption.state = viewoption.state^QStyle::State_HasFocus;
  97. }
  98. QStyledItemDelegate::paint(painter, viewoption, index);
  99. //绘制checkbox
  100. {
  101. QRect checboxRec(rect.left() + 10, rect.top() + (rect.height()-14)/2, 14, 14);
  102. if(bCheck)
  103. {
  104. QPixmap pix(":/Resource/Image/MainForm/select.png");
  105. painter->drawPixmap(checboxRec, pix);
  106. }
  107. else
  108. {
  109. QPixmap pix(":/Resource/Image/MainForm/select_checked.png");
  110. painter->drawPixmap(checboxRec, pix);
  111. }
  112. }
  113. //绘制文本
  114. {
  115. painter->save();
  116. //设置字体,颜色
  117. QFont font;
  118. font.setFamily("Microsoft YaHei");
  119. font.setPixelSize(12);
  120. painter->setFont(font);
  121. QRect txtRec(rect.left() + 40, rect.top(), rect.width()-100, rect.height());
  122. painter->drawText(txtRec, Qt::AlignLeft, sDes);
  123. painter->restore();
  124. }
  125. }
  126. /*************************
  127. * CustomListViewDelegate-编辑事件
  128. * ***********************/
  129. bool CustomListViewDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
  130. {
  131. QRect rect = option.rect;
  132. //获取checkbox的rect
  133. QRect checboxRec(rect.left() + 10, rect.top() + (rect.height()-14)/2, 14, 14);
  134. //按钮点击事件,点击坐标是否在rect内
  135. QMouseEvent *mevent = static_cast<QMouseEvent*>(event);
  136. if(checboxRec.contains(mevent->pos()) && event->type() == QEvent::MouseButtonPress)
  137. {
  138. bool value = model->data(index, Qt::UserRole+1).toBool();
  139. model->setData(index, !value, Qt::UserRole+1);
  140. model->dataChanged(index, index);
  141. //此处可以添加自定义信号,即使checbox点击信号;
  142. MY_DEBUG << "Edit";
  143. }
  144. return QStyledItemDelegate::editorEvent(event, model, option, index);
  145. }

customlistwidgetitem.h

  1. #ifndef CUSTOMLISTWIDGETITEM_H
  2. #define CUSTOMLISTWIDGETITEM_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class CustomListWidgetItem;
  6. }
  7. //自定义ListWidgetItem
  8. class CustomListWidgetItem : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit CustomListWidgetItem(QWidget *parent = nullptr);
  13. ~CustomListWidgetItem();
  14. //设置数据
  15. void SetData(const QString& sName, const QString& sDes, const QString& sPic);
  16. private:
  17. Ui::CustomListWidgetItem *ui;
  18. };
  19. #endif // CUSTOMLISTWIDGETITEM_H

customlistwidgetitem.cpp

  1. #include "customlistwidgetitem.h"
  2. #include "ui_customlistwidgetitem.h"
  3. CustomListWidgetItem::CustomListWidgetItem(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::CustomListWidgetItem)
  6. {
  7. ui->setupUi(this);
  8. }
  9. CustomListWidgetItem::~CustomListWidgetItem()
  10. {
  11. delete ui;
  12. }
  13. void CustomListWidgetItem::SetData(const QString &sName, const QString &sDes, const QString &sPic)
  14. {
  15. ui->label_name->setText(sName);
  16. ui->label_des->setText(sDes);
  17. QPixmap pic(sPic);
  18. int nWidth = ui->label_pic->width();
  19. int nHeight = ui->label_pic->height();
  20. //饱满填充
  21. QPixmap pic_fit = pic.scaled(nWidth, nHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
  22. ui->label_pic->setPixmap(pic_fit);
  23. }

实现效果

在这里插入图片描述

工程下载地址:

https://download.csdn.net/download/linyibin_123/86512679

标签: qt ui 开发语言

本文转载自: https://blog.csdn.net/linyibin_123/article/details/126773179
版权归原作者 浅笑一斤 所有, 如有侵权,请联系我们删除。

“Qt之列表的使用(QListView、QListWidget)”的评论:

还没有评论