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_OBJECT
public:
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, 点 添加-提升