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

Posted

技术标签:

【中文标题】QTableView,如何改变拖动多个项目的显示【英文标题】:QTableView, how to change dragging multiple items display 【发布时间】:2017-07-05 13:58:09 【问题描述】:

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

我的 QT 表

windows 拖放文件夹

【问题讨论】:

所以你想让图像变成像windows这样的通用图像? QTableView 还是 QTableWidget? 在我的小例子中我使用了QTableWidget,但我认为它与QTableView 相同。我想将“drop”预览更改为更易于理解,例如,而不是显示三个浮动项目,而是在 windows 中显示一个图标(指示 3) 【参考方案1】:

在 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);
    
  

【讨论】:

【参考方案2】:

以这个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);

输出:

【讨论】:

感谢您提供信息。你给了我 Qpixmap 的输入,但解决方案不起作用,因为我也有一个模型实现,并且 mime 数据被 mousePressEvent 破坏了。如果有人需要,我会发布我的最终解决方案

以上是关于QTableView,如何改变拖动多个项目的显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个 QTableView 中显示多个 QSqlTableModel 的内容?

如何复制 - 将 QStandardItemModel 创建的 QTableView 中的多个项目粘贴到文本/excel 文件中?

QTableView 固定列宽度(鼠标拖动后,仍可固定)

在 QTableView 的单个单元格中显示多个图标

如何设置qtableview中的qcombobox的显示样式

qtableview 文本编辑