Ich versuche, Drag & Drop-Elemente (plain/Text) von einem QListView zum anderen zu implementieren. Das Ziehen beginnt gut (ich kann sogar Elemente in andere Anwendungen verschieben, die Texttropfen akzeptieren), aber meine zweite QListView akzeptiert aus irgendeinem Grund keine Tropfen. Hier ist wie die Listenansicht konfiguriert:QListView externen Tropfen funktioniert nicht
ui->lessonsListView->setAcceptDrops(true);
ui->lessonsListView->setDropIndicatorShown(true);
ui->lessonsListView->setDragDropMode(QAbstractItemView::DropOnly);
ui->lessonsListView->setDragDropOverwriteMode(true);
Das Proxy-Modell für diese Listview implementiert die nächsten Methoden:
Qt::ItemFlags LessonsProxyModel::flags(const QModelIndex &index) const
{
qDebug() << __FUNCTION__;
return Qt::ItemIsDropEnabled | QSortFilterProxyModel::flags(index);
}
Qt::DropActions LessonsProxyModel::supportedDropActions() const
{
qDebug() << __FUNCTION__;
return Qt::MoveAction;
}
bool LessonsProxyModel::canDropMimeData(const QMimeData *data,
Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
qDebug() << __FUNCTION__;
Q_UNUSED(action);
Q_UNUSED(row);
Q_UNUSED(column);
if (!data->hasFormat("text/plain") || !parent.isValid())
return false;
return true;
}
bool LessonsProxyModel::dropMimeData(const QMimeData *data,
Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
qDebug() << __FUNCTION__;
if (!canDropMimeData(data, action, row, column, parent))
return false;
emit dataDropped(data, parent);
return true;
}
den Anwendungs Ausgang Ich sehe, dass nur supportedDropActions()
und flags()
genannt werden. Weder canDropMimeData()
noch dropMimeData()
jemals genannt. Was mache ich falsch? Alle Hinweise werden geschätzt.
Vielen Dank!
EDITED:
Nur für den Fall: unten ist Quellcode für Listview und das Modell an dieser Stelle ziehen initiiert wird: Listview-Setup:
ui->abonsListView->setDragEnabled(true);
proxyModel Code:
Qt::ItemFlags AbonsProxyModel::flags(const QModelIndex &index) const
{
return Qt::ItemIsDragEnabled | QSortFilterProxyModel::flags(index);
}
Qt::DropActions AbonsProxyModel::supportedDragActions() const
{
qDebug() << __FUNCTION__;
return Qt::MoveAction;
}
QStringList AbonsProxyModel::mimeTypes() const
{
qDebug() << __FUNCTION__;
QStringList types;
types << "text/plain";
return types;
}
QMimeData *AbonsProxyModel::mimeData(const QModelIndexList &indexes) const
{
qDebug() << __FUNCTION__;
QMimeData *mimeData = new QMimeData();
foreach (const QModelIndex &index, indexes)
if (index.isValid())
{
mimeData->setText(data(index, AbonsModel::Id).toString());
qDebug() << __FUNCTION__;
return mimeData;
}
return mimeData;
}
Ich glaube, Sie müssen 'dragEnterEvent',' dragMoveEvent' und 'dropEvent' der' QListView'-Unterklasse außer Kraft setzen. Sehen Sie sich die [Dokumentation] (http://doc.qt.io/qt-5/dnd.html) und [examples] (http://doc.qt.io/qt-5/examples-draganddrop) an. html) – Marcus
Danke! Ich werde es versuchen. Aber die obige Dokumentation besagt: 'Dieses Dokument beschreibt den grundlegenden Drag & Drop-Mechanismus und umreißt den Ansatz, der verwendet wird, um es in benutzerdefinierten Steuerelementen zu aktivieren. Und ich folgte nur den Anweisungen unter dem Link" Verwenden von Drag & Drop mit Elementansichten ". Ziehen Sie auch die Arbeit perfekt für eine andere Listenansicht ohne Unterklassen: Objektansichten haben bereits Unterstützung für Drag & Drop. –
Ja ist der Widerstand perfekt implementiert. Der Drop funktioniert jedoch nicht wie erwartet. Ich habe versucht, ein einfaches Drag-and-Drop-Experiment mit einem 'QListView' verbunden mit' QFileSystemModel' und einem Datei-Browser (Delfin) durchzuführen. Das Ziehen von 'QListView' nach Delfin funktioniert wunderbar, aber umgekehrt ist das nicht akzeptabel. Also glaube ich, dass Sie 'dragEnterEvent',' dragMoveEvent' und 'dropEvent' für das Widget einrichten müssen, in dem Sie den Drop durchführen wollen. – Marcus