我尝试实现基于拖放的选择,用户可以将元素拖放到小部件内的不同位置以启动某些过程。我首先查看 Qt DropSite 示例,然后通过向 DropArea 添加一个大小为 60x60px 的标签来更改它。然后我根据http://qt-project.org/doc/qt-4.8/dnd.html(Drop RectanglesDropArea::dragMoveEvent(QDragMoveEvent *event)
部分)中的示例更改了方法,而我与提到的.label
dropFrame
DropArea::DropArea(QWidget *parent)
: QLabel(parent)
{
setMinimumSize(200, 200);
setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
setAlignment(Qt::AlignCenter);
setAcceptDrops(true);
setAutoFillBackground(true);
clear();
label = new QLabel("Target", this);
label->setFixedSize(60, 60);
label->setAutoFillBackground(true);
label->setBackgroundRole(QPalette::Light);
label->move(80, 60);
}
void DropArea::dragMoveEvent(QDragMoveEvent *event)
{
if(event->answerRect().intersects(label->geometry()))
{
setText(tr("<drop content>"));
setBackgroundRole(QPalette::Highlight);
event->acceptProposedAction();
emit changed(event->mimeData());
}
}
根据文档,必须接受dragEnterEvent 中的QDragEnterEvent 才能接收dragMoveEvents。我接受了该事件,但这会在输入 DropArea 后立即将光标更改为复制数据符号,并且在整个小部件上都接受放置操作,而不仅仅是标签。
我是否必须自己处理光标更改,还是我忽略了一些细节以允许 Qt 正确处理该过程?