QTableView,如何更改拖动多个项目的显示

时间:2017-07-05 13:58:10

标签: c++ qt qt5 qtableview

我有一个QTableView和我自己实现的QAbstractItemModel,我可以在其中拖放多个项目。我的问题是,当拖动项目并尝试将它们放入目标单元格时,对于用户来说,结果将不会是什么样的。例如,我有以下内容,但我更喜欢默认的寡妇显示,这使得所有3个项目都像一个项目:

我的QT表

VS

windows拖动n个文件夹

2 个答案:

答案 0 :(得分:1)

将此tutorial作为参考,将覆盖mousePressEvent方法,并在QDrag中放置一个新的QPixmap:

void mousePressEvent(QMouseEvent *event){
    if (event->button() == Qt::LeftButton){

        QDrag *drag = new QDrag(this);
        drag->setMimeData(new QMimeData());
        drag->setPixmap(QPixmap("image.png"));

        drag->exec();
    }
    QTableView::mousePressEvent(event);
}

输出:

enter image description here

答案 1 :(得分:0)

在eyllanesc对QPixmap的建议之后,我找到了解决问题的正确方法,以便我可以保持mime数据来自我的模型。我在QTreeView类中重新实现了startDrag(Qt :: DropActions supportedActions),这样当移动多个对象时,将显示一个图标以及移动的项目数。现在看起来像这样:

void MyTreeView::startDrag(Qt::DropActions supportedActions)
{
    QModelIndexList indexes = selectedIndexes();
    if (indexes.size() == 1)
        return QAbstractItemView::startDrag(supportedActions);
    if (indexes.count() > 0) 
    {
        QMimeData *data = model()->mimeData(indexes);
        if (!data)
           return;
        QRect rect; 
        rect.adjust(horizontalOffset(), verticalOffset(), 0, 0);
        QDrag *drag = new QDrag(this);

        ActionTreeItem* pItem = static_cast<ActionTreeItem*>(indexes[0].internalPointer());
        if (pItem != NULL)
        {
            QPixmap pixmap = myIcon.pixmap(myIcon.actualSize(QSize(32, 32)));
            QPainter *paint = new QPainter(&pixmap);
            paint->setPen(Qt::black);
            paint->setBrush(QBrush(Qt::white));
            QRect numberRect(18, 18, 13, 13);
            paint->drawRect(numberRect);
            paint->drawText(numberRect, Qt::AlignHCenter | Qt::AlignVCenter, QString("%1").arg(indexes.count()));
           drag->setPixmap(pixmap);
        }       
       drag->setMimeData(data);
       Qt::DropAction defaultDropAction = Qt::MoveAction;
       drag->exec(supportedActions, defaultDropAction);
    }
  }