2016-04-07 15 views
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(); 
    } 
} 
+0

"奇妙な"? 'qDebug()<< drag-> target()'をダンプし、あなたに見えるものを教えてください。 *注:質問を編集してコメントには回答しません。これはディスカッションフォーラムではありません。* –

+0

@KubaOber:デバッグコードを追加し、最終的に問題を知りました。 'QDrag :: target()'は、リストウィジェットの子ウィジェット「qt_scrollarea_viewport」を返します。今質問にどうすればいいですか? – keyblade

+0

理想的には、 'target()'が奇妙なアドレスを返すのではなく、予期せぬオブジェクトを返すことはありません)、あなた自身の質問に答え、2日後に自分の答えを受け入れるのが理想です。 –

答えて

0

簡単なデバッグコード

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

を追加することにより、私は答えを得ます。 qDebug()の出力は

QWidget(0xa1bef0, name = "qt_scrollarea_viewport") 
実際 target()

奇妙なアドレスを返しません。このcase.So QDrag::target()qt_scrollarea_viewportという名前listwidgetの子ウィジェットを返しますが、おそらく予想外のオブジェクトです。

@KubaOberに特別なおかげです。

関連する問題