1 基本用法
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget){ ui->setupUi(this); //QListWidgetItem* item = new QListWidgetItem("君不见黄河之水天上来"); //item->setTextAlignment(Qt::AlignHCenter); //设置对齐方式 //ui->listWidget->addItem(item); QList<QString> list; //QStringList 等价于 QList<QString> list << "君不见黄河之水天上来" << "奔流到海不复回" << "君不见高堂明镜悲白发" << "朝如青丝暮成雪"; ui->listWidget->addItems(list);}

2 实现列表框拖拽调整项位置
(1) 法一(推荐)

(2) 法二
1) 新建一个类ListWidgetPro, 继承自QListWidget
// ListWidgetPro.h#pragma once#include "pch.h"class ListWidgetPro:public QListWidget{ Q_OBJECTpublic: ListWidgetPro(QWidget* parent):QListWidget(parent) { setAcceptDrops(TRUE); }; ~ListWidgetPro() {};protected: // 重写下面两个函数来完成从该部件中拖拽出去的操作. void mousePressEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); // 重写下面三个函数来完成接受外来拖拽的操作. void dragEnterEvent(QDragEnterEvent* event); void dragMoveEvent(QDragMoveEvent* event); void dropEvent(QDropEvent* event);private: QPoint m_dragPoint; // 拖拽的起点 QListWidgetItem* m_dragItem; // 被拖拽的项};
// ListWidgetPro.cpp#include "ListWidgetPro.h"#include <QDrag>#include <QMimeData>// 鼠标点击void ListWidgetPro::mousePressEvent(QMouseEvent* event){ if (event->button() == Qt::LeftButton) { m_dragPoint = event->pos(); // 保存拖拽的起点 m_dragItem = itemAt(event->pos()); // 保存拖拽的项 } QListWidget::mousePressEvent(event);}// 鼠标移动void ListWidgetPro::mouseMoveEvent(QMouseEvent* event){ if (event->buttons() & Qt::LeftButton) { QPoint temp = event->pos() - m_dragPoint; // 只有这个长度大于默认的距离,才会被系统认为是形成拖拽的操作 if (temp.manhattanLength() > QApplication::startDragDistance()) { QDrag* drag = new QDrag(this); QMimeData* mimeData = new QMimeData(); mimeData->setText(m_dragItem->text()); drag->setMimeData(mimeData); auto action = drag->exec(Qt::CopyAction | Qt::MoveAction); if (action == Qt::CopyAction || action == Qt::MoveAction) { delete m_dragItem; // 当成功拖拽后,删除拖拽项 } } } QListWidget::mouseMoveEvent(event);}// 拖拽项进入void ListWidgetPro::dragEnterEvent(QDragEnterEvent* event){ event->setDropAction(Qt::MoveAction); event->accept();}// 拖拽项移动void ListWidgetPro::dragMoveEvent(QDragMoveEvent* event){ event->setDropAction(Qt::MoveAction); event->accept();}// 拖拽项放下void ListWidgetPro::dropEvent(QDropEvent* event){ QString qstr = event->mimeData()->text(); if (!qstr.isEmpty()) { auto item = itemAt(event->pos()); // 找到鼠标位置对应的列表中的项 if (!item) addItem(qstr); else insertItem(row(item), qstr); event->setDropAction(Qt::MoveAction); event->accept(); }}
2) 把ListWidget提升为ListWidgetPro, 点 添加-提升
