1 基本用法

  1. Widget::Widget(QWidget *parent)
  2. : QWidget(parent)
  3. , ui(new Ui::Widget)
  4. {
  5. ui->setupUi(this);
  6. //QListWidgetItem* item = new QListWidgetItem("君不见黄河之水天上来");
  7. //item->setTextAlignment(Qt::AlignHCenter); //设置对齐方式
  8. //ui->listWidget->addItem(item);
  9. QList<QString> list; //QStringList 等价于 QList<QString>
  10. list << "君不见黄河之水天上来"
  11. << "奔流到海不复回"
  12. << "君不见高堂明镜悲白发"
  13. << "朝如青丝暮成雪";
  14. ui->listWidget->addItems(list);
  15. }

image.png

2 实现列表框拖拽调整项位置

(1) 法一(推荐)

image.png

(2) 法二

1) 新建一个类ListWidgetPro, 继承自QListWidget

  1. // ListWidgetPro.h
  2. #pragma once
  3. #include "pch.h"
  4. class ListWidgetPro:public QListWidget
  5. {
  6. Q_OBJECT
  7. public:
  8. ListWidgetPro(QWidget* parent):QListWidget(parent) { setAcceptDrops(TRUE); };
  9. ~ListWidgetPro() {};
  10. protected:
  11. // 重写下面两个函数来完成从该部件中拖拽出去的操作.
  12. void mousePressEvent(QMouseEvent* event);
  13. void mouseMoveEvent(QMouseEvent* event);
  14. // 重写下面三个函数来完成接受外来拖拽的操作.
  15. void dragEnterEvent(QDragEnterEvent* event);
  16. void dragMoveEvent(QDragMoveEvent* event);
  17. void dropEvent(QDropEvent* event);
  18. private:
  19. QPoint m_dragPoint; // 拖拽的起点
  20. QListWidgetItem* m_dragItem; // 被拖拽的项
  21. };
  1. // ListWidgetPro.cpp
  2. #include "ListWidgetPro.h"
  3. #include <QDrag>
  4. #include <QMimeData>
  5. // 鼠标点击
  6. void ListWidgetPro::mousePressEvent(QMouseEvent* event)
  7. {
  8. if (event->button() == Qt::LeftButton) {
  9. m_dragPoint = event->pos(); // 保存拖拽的起点
  10. m_dragItem = itemAt(event->pos()); // 保存拖拽的项
  11. }
  12. QListWidget::mousePressEvent(event);
  13. }
  14. // 鼠标移动
  15. void ListWidgetPro::mouseMoveEvent(QMouseEvent* event)
  16. {
  17. if (event->buttons() & Qt::LeftButton) {
  18. QPoint temp = event->pos() - m_dragPoint;
  19. // 只有这个长度大于默认的距离,才会被系统认为是形成拖拽的操作
  20. if (temp.manhattanLength() > QApplication::startDragDistance()) {
  21. QDrag* drag = new QDrag(this);
  22. QMimeData* mimeData = new QMimeData();
  23. mimeData->setText(m_dragItem->text());
  24. drag->setMimeData(mimeData);
  25. auto action = drag->exec(Qt::CopyAction | Qt::MoveAction);
  26. if (action == Qt::CopyAction || action == Qt::MoveAction) {
  27. delete m_dragItem; // 当成功拖拽后,删除拖拽项
  28. }
  29. }
  30. }
  31. QListWidget::mouseMoveEvent(event);
  32. }
  33. // 拖拽项进入
  34. void ListWidgetPro::dragEnterEvent(QDragEnterEvent* event)
  35. {
  36. event->setDropAction(Qt::MoveAction);
  37. event->accept();
  38. }
  39. // 拖拽项移动
  40. void ListWidgetPro::dragMoveEvent(QDragMoveEvent* event)
  41. {
  42. event->setDropAction(Qt::MoveAction);
  43. event->accept();
  44. }
  45. // 拖拽项放下
  46. void ListWidgetPro::dropEvent(QDropEvent* event)
  47. {
  48. QString qstr = event->mimeData()->text();
  49. if (!qstr.isEmpty()) {
  50. auto item = itemAt(event->pos()); // 找到鼠标位置对应的列表中的项
  51. if (!item)
  52. addItem(qstr);
  53. else
  54. insertItem(row(item), qstr);
  55. event->setDropAction(Qt::MoveAction);
  56. event->accept();
  57. }
  58. }

2) 把ListWidget提升为ListWidgetPro, 点 添加-提升

image.png