2016-04-07 11 views
1

Ben oluşturduk iki QCustomListWidget .in QListWidget hayranlarıyla sürükle teşvik etmek ve onları iyi çalışıyor arasında açılan, ancak başarılı QDrag::exec() sonra QDrag::target() çağırdığınızda değil eşit hedef QCustomListWidget yapar garip bir adres verir tarafından qt tasarımcı. Ayrıca, QDrag::source()'un dönüşü doğrudur.QDrag :: target() neden QDrag :: exec()? Dan sonra garip bir adres döndürüyor?

İşte basitleştirilmiş kod.

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

"Garip" nasıl? QDebug() << drag-> target() 'i boşaltın ve ne gördüğünüzü bize bildirin. * Not: Soruyu düzenleyerek, yorum yazarak soruyla ilgili bir soruyu yanıtlayın. Bu bir tartışma forumu değil. * –

+0

@KubaOber: Hata ayıklama kodlarını ekledim ve sonunda sorunu biliyorum. 'QDrag :: target()' liste widget'ının 'qt_scrollarea_viewport' adlı alt parçasını döndürür. Çok teşekkürler.Ve ... Şimdi soruya ne yapmalıyım? – keyblade

+0

İdeal olarak, onu revize etmelisiniz ('target()' garip bir adres değil, belki de beklenmedik bir nesne döndürmez) ve kendi sorunuzu cevaplayın ve 2 gün sonra kendi cevabınızı kabul edin. –

cevap

0

basit hata ayıklama kodları

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

ekleyerek ben cevap olsun. qDebug() 'ın çıkış

QWidget(0xa1bef0, name = "qt_scrollarea_viewport") 
Aslında target()

garip adresi dönmez bu case.So QDrag::target() yılında qt_scrollarea_viewport adlı listwidget en alt widget verir, ama belki de beklenmedik bir nesnedir.

@KubaOber'e özel teşekkürler.

İlgili konular