如何解决如何将特定的QPixmap拖放到QGraphicsView中?
在子类QListWidget
上,我有几个项目。下面显示的每个QListWidget
项目(例如“ ROS Init”,“ Images”等)都与一个特定的图标相关联。
问题,我要尝试拖放与该QListWidget
项目相对应的特定图标,但是什么也没发生。
在负责拖动的功能下方:
void ListView::startDrag(Qt::DropActions supportedActions)
{
QMap<int,QString> icons;
icons.insert(IT_RosInit,"ROS Init");
icons.insert(IT_Images,"Images");
icons.insert(IT_Path,"Path");
icons.insert(IT_RosShutDown,"ROS Shutdown");
if (supportedActions & Qt::copyAction)
{
const QList<QListWidgetItem *> &m_items(selectedItems());
if (m_items.isEmpty())
return;
Qpixmap pixmapLaser("/home/images/laserscan.png");
Qpixmap pixmapPCloud2("/home/images/pcloud2.png");
// etc ...
QStringList iconImages;
for(int i = 0; i < icons.count(); ++i)
{
for (const QString &tableType : iconImages) {
if (tableType == "ROS Init")
{
auto *data = mimeData(m_items);
auto *drag = new QDrag(this);
drag->setpixmap(pixmapLaser);
drag->setMimeData(data);
drag->setHotSpot(pixmapLaser.rect().center());
drag->exec(Qt::copyAction);
}
else if(tableType == "Images")
{
auto *data2 = mimeData(m_items);
auto *drag2 = new QDrag(this);
drag2->setpixmap(pixmapPCloud2);
drag2->setMimeData(data2);
drag2->setHotSpot(pixmapPCloud2.rect().center());
drag2->exec(Qt::copyAction);
}
}
}
}
else
{
QListWidget::startDrag(supportedActions);
}
}
子类化QListWidget
之后,我重新实现了通常的拖放功能。除startDrag
以外的所有其他功能均正常运行,实际上,当我尝试拖动适当的Qpixmap
时,实际上看不到任何拖动。
我咨询了有用的this source,还有this other source,这虽然有用,但它没有重新实现startDrag
,而是dropEvent
,这对我来说不是问题,因为效果很好。
我还咨询了this source和this other source,但这也无助于解决问题。
解决方法
解决方案
我将通过以下方式解决此问题:
-
设置
QListWidgetItem
的{{3}}标志以启用要拖动的项目:item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
-
为每个项目设置所需的数据:
item->setData(Qt::UserRole,type);
其中type
是枚举值IT_RosInit
,IT_Images
等之一。
-
启用
ListWidget
的拖动功能:setDragEnabled(true); setDragDropMode(QAbstractItemView::DragOnly);
-
使用项目设置来设置在
QDrag
中创建的startDrag
对象。
示例
以下是我为您准备的一个示例,以演示如何实现建议的解决方案:
MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
auto *l = new QVBoxLayout(this);
auto *list = new ListView(this);
list->addItem(createItem(":/pix/images/laserscan.png",tr("RosInit"),IT_RosInit));
list->addItem(createItem(":/pix/images/icons/pcloud2.png",tr("Images"),IT_Images));
list->addItem(createItem(":/pix/images/icons/some_icon.png",tr("Path"),IT_Path));
list->addItem(createItem(":/pix/images/icons/another_icon.png",tr("RosShutDown"),IT_RosShutDown));
l->addWidget(list);
resize(300,400);
setWindowTitle("IconDrag");
}
QListWidgetItem *MainWindow::createItem(const QString &pm,const QString &text,int type)
{
auto *item = new QListWidgetItem(QIcon(QPixmap(pm)),text);
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
item->setData(Qt::UserRole,type);
return item;
}
ListView.cpp
ListView::ListView(QWidget *parent) :
QListWidget(parent)
{
setDragEnabled(true);
setDragDropMode(QAbstractItemView::DragOnly);
setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode(QAbstractItemView::SingleSelection);
}
void ListView::startDrag(Qt::DropActions supportedActions)
{
if (supportedActions & Qt::CopyAction) {
const QList<QListWidgetItem *> &items(selectedItems());
if (items.isEmpty())
return;
const QPixmap &pm(items.first()->icon().pixmap(64));
auto *item = items.first();
auto *mimeData = new QMimeData();
auto *drag = new QDrag(this);
mimeData->setData("text/plain",item->data(Qt::UserRole).toByteArray());
drag->setPixmap(pm);
drag->setMimeData(mimeData);
drag->setHotSpot(pm.rect().center());
drag->exec(Qt::CopyAction);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。