1
私はうまく動作しますが、私は成功しQDrag::exec()
後QDrag::target()
を呼び出すときにターゲットQCustomListWidget
に等しくない奇妙なアドレスを返し、それらの間のQListWidget
【選択のドラッグ&ドロップを促進することによりQTデザイナー.IN 2 QCustomListWidget
を作成しました。また、QDrag::source()
の返品は正しいです。なぜQDrag :: target()はQDrag :: exec()の後で奇妙なアドレスを返しますか?
ここに簡略化されたコードがあります。
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()'をダンプし、あなたに見えるものを教えてください。 *注:質問を編集してコメントには回答しません。これはディスカッションフォーラムではありません。* –
@KubaOber:デバッグコードを追加し、最終的に問題を知りました。 'QDrag :: target()'は、リストウィジェットの子ウィジェット「qt_scrollarea_viewport」を返します。今質問にどうすればいいですか? – keyblade
理想的には、 'target()'が奇妙なアドレスを返すのではなく、予期せぬオブジェクトを返すことはありません)、あなた自身の質問に答え、2日後に自分の答えを受け入れるのが理想です。 –