QTableView,如何改变拖动多个项目显示
QTableView, how to change dragging multiple items display
我有一个 QTableView 和我自己实现的 QAbstractItemModel,我可以在其中拖放多个项目。我的问题是,当拖动项目并试图将它们放在目标单元格中时,用户并不清楚结果会是什么。例如,我有以下内容,但我更喜欢像默认寡妇显示那样的东西,这使得所有 3 个项目都像一个项目:
我的QTTable
对
windows拖放n个文件夹
以此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);
}
输出:
在 eyllanesc 对 QPixmap 的建议之后,我找到了解决问题的正确方法,这样我就可以保留来自模型的 mime 数据。我在我的 QTreeView class 中重新实现了 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);
}
}
我有一个 QTableView 和我自己实现的 QAbstractItemModel,我可以在其中拖放多个项目。我的问题是,当拖动项目并试图将它们放在目标单元格中时,用户并不清楚结果会是什么。例如,我有以下内容,但我更喜欢像默认寡妇显示那样的东西,这使得所有 3 个项目都像一个项目:
我的QTTable
对
windows拖放n个文件夹
以此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);
}
输出:
在 eyllanesc 对 QPixmap 的建议之后,我找到了解决问题的正确方法,这样我就可以保留来自模型的 mime 数据。我在我的 QTreeView class 中重新实现了 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);
}
}