Qt 小例子学习17 - QListView 拖拽

Qt 小例子学习17 - QListView 拖拽

ListWidget.h

#ifndef LISTWIDGET_H
#define LISTWIDGET_H

#include <QDrag>
#include <QListWidget>
#include <QMimeData>
#include <QPainter>

class ListWidget : public QListWidget
{
protected:
    void startDrag(Qt::DropActions supportedActions)
    {
        QDrag *drag = new QDrag(this);
        drag->setMimeData(model()->mimeData(selectedIndexes()));
        QPixmap pixmap(viewport()->visibleRegion().boundingRect().size());
        pixmap.fill(Qt::transparent);
        QPainter painter(&pixmap);
        for (QModelIndex index : selectedIndexes())
        {
            painter.drawPixmap(visualRect(index),
                               viewport()->grab(visualRect(index)));
        }
        drag->setPixmap(pixmap);
        drag->setHotSpot(viewport()->mapFromGlobal(QCursor::pos()));
        drag->exec(supportedActions, Qt::MoveAction);
    }
};

#endif // LISTWIDGET_H

main.cpp

#include "listwidget.h"

#include <QApplication>
#include <QLabel>
#include <QLineEdit>
#include <QListWidget>
#include <QPushButton>
#include <QSpinBox>
#include <QVBoxLayout>

class ItemWidget : public QWidget
{
public:
    ItemWidget(QString str, QWidget *parent = Q_NULLPTR) : QWidget(parent)
    {
        QVBoxLayout *layout = new QVBoxLayout;
        layout->setContentsMargins(0, 0, 0, 0);
        layout->setSpacing(0);

        QHBoxLayout *contentLayout = new QHBoxLayout;
        contentLayout->setSizeConstraint(QLayout::SetFixedSize);
        contentLayout->setSpacing(0);

        contentLayout->addSpacing(5);
        contentLayout->setContentsMargins(10, 20, 10, 20);

        QLabel *iconLbl = new QLabel;
        iconLbl->setPixmap(QPixmap(":/icon.png"));
        iconLbl->setMaximumWidth(20);
        contentLayout->addWidget(iconLbl, 0, Qt::AlignTop);

        contentLayout->addSpacing(14);

        QVBoxLayout *pageInfoLayout = new QVBoxLayout;
        pageInfoLayout->setContentsMargins(0, 0, 0, 0);
        pageInfoLayout->setSpacing(0);

        QLabel *pageNameLbl = new QLabel("First line of text" + str);
        pageInfoLayout->addWidget(pageNameLbl);

        pageInfoLayout->addSpacing(4);

        QLabel *pagePreviewLbl = new QLabel("Second line of text" + str);
        pageInfoLayout->addWidget(pagePreviewLbl);

        contentLayout->addLayout(pageInfoLayout);

        layout->addLayout(contentLayout);

        setLayout(layout);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle("fusion");
    ListWidget *listWidget = new ListWidget;
    listWidget->setAcceptDrops(true);
    listWidget->setDragDropMode(QAbstractItemView::InternalMove);
    listWidget->setDragEnabled(true);
    listWidget->setSelectionMode(QAbstractItemView::SingleSelection);

    for (int i = 0; i < 50; ++i)
    {
        ItemWidget *item = new ItemWidget(QString::number(i));
        QListWidgetItem *listItem = new QListWidgetItem;
        listItem->setSizeHint(item->sizeHint());
        listWidget->addItem(listItem);
        listWidget->setItemWidget(listItem, item);
    }
    listWidget->show();

    return a.exec();
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值