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();
}
}
"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. * –
@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
İ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. –