gpt4 book ai didi

c++ - 为什么 QDrag::target() 在 QDrag::exec() 之后返回一个奇怪的地址?

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:59 24 4
gpt4 key购买 nike

我创建了两个 QCustomListWidget。在 qt 设计器中通过提升 QListWidget。它们之间的拖放效果很好,但是当我调用 QDrag::target()QDrag::exec() 成功后返回一个不等于目标 QCustomListWidget 的奇怪地址。此外,QDrag::source() 的返回是正确的。

这是简化的代码。

class QCustomListWidget:public QListWidget 
{
Q_OBJECT

public:
explicit QCustomListWidget(QWidget* parent = 0);

protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);

private:
void StartDrag();

QPoint m_eventstartpos;
};

QCustomListWidget::QCustomListWidget(QWidget* parent) : QListWidget(parent)
{
setAcceptDrops(true);
}


void QCustomListWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_eventstartpos = event->pos();
}

QListWidget::mousePressEvent(event);
}

void QCustomListWidget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
int distance = (event->pos() - m_eventstartpos).manhattanLength();
if (distance >= QApplication::startDragDistance())
{
StartDrag();
}
}
}

void QCustomListWidget::StartDrag()
{
QMimeData *mimeData = new QMimeData;
//
// ...set mimedata...
//

QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);

Qt::DropAction da;
da = drag->exec(Qt::MoveAction);
if (da == Qt::MoveAction)
{
QObject* s = drag->source(); // s is correct
QObject* t = drag->target(); // t is an strange address
QCustomListWidget* targetlw = qobject_cast<QCustomListWidget*>(drag->target()); // targetlw == nullptr

qDebug() << drag->target(); // output: QWidget(0xa1bef0, name = "qt_scrollarea_viewport")
}
}

void QCustomListWidget::dragEnterEvent(QDragEnterEvent *event)
{
QObject* src = event->source();
QCustomListWidget *sourcelw = qobject_cast<QCustomListWidget *>(src);
if (sourcelw && sourcelw != this)
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
}

void QCustomListWidget::dragMoveEvent(QDragMoveEvent *event)
{
QObject* src = event->source();
QCustomListWidget *sourcelw = qobject_cast<QCustomListWidget *>(src);
if (sourcelw && sourcelw != this)
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
}

void QCustomListWidget::dropEvent(QDropEvent *event)
{
QObject* src = event->source();
QCustomListWidget *sourcelw = qobject_cast<QCustomListWidget *>(src);
if (sourcelw && sourcelw != this)
{
// process data

event->setDropAction(Qt::MoveAction);
event->accept();
}
}

最佳答案

通过添加简单的调试代码

qDebug() << drag->target();

我得到了答案。qDebug() 的输出是

QWidget(0xa1bef0, name = "qt_scrollarea_viewport")

实际上 target() 在这种情况下返回名为 qt_scrollarea_viewport 的 listwidget 的子 widget。所以 QDrag::target() 不会返回一个奇怪的地址,但可能是一个意想不到的对象。

特别感谢@KubaOber。

关于c++ - 为什么 QDrag::target() 在 QDrag::exec() 之后返回一个奇怪的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36477044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com