私はドラッグリスト項目(プレーン/テキスト)を別のQListViewにドラッグ&を実装しようとしています。ドラッグがうまく始まります(テキストドロップを受け付ける別のアプリケーションにアイテムをドロップすることさえできます)が、私の2番目のQListViewは何らかの理由でドロップを受け入れません。ここ は、リストビューで構成された方法です。このリストビューのためのQListViewの外部ドロップが機能しません
ui->lessonsListView->setAcceptDrops(true);
ui->lessonsListView->setDropIndicatorShown(true);
ui->lessonsListView->setDragDropMode(QAbstractItemView::DropOnly);
ui->lessonsListView->setDragDropOverwriteMode(true);
プロキシモデルは、次のメソッドを実装します。私はsupportedDropActions()
とflags()
と呼ばれていることがわかりアプリケーションの出力から
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;
}
。 canDropMimeData()
でもdropMimeData()
もこれまでに呼ばれていません。私は間違って何をしていますか? ヒントをいただければ幸いです。
ありがとうございました!
EDITED:
念のため: リストビューセットアップ:
ui->abonsListView->setDragEnabled(true);
proxyModelコード:
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;
}
私はあなたが 'dragEnterEvent'、' dragMoveEvent'と 'QListView'サブクラスの' dropEvent'をオーバーライドする必要があり、信じています。 [documentation](http://doc.qt.io/qt-5/dnd.html)と[examples](http://doc.qt.io/qt-5/examples-draganddrop)をご覧ください。 html) – Marcus
ありがとう!試してみます。しかし、上記のドキュメントでは、「このドキュメントでは、基本的なドラッグ&ドロップのメカニズムについて説明し、カスタムコントロールでそれを有効にするためのアプローチについて概説しています」と、「アイテムビューでドラッグ&ドロップを使用する」リンクの手順をたどりました。また、サブクラス化せずに別のリストビューに最適な作業をドラッグすると、アイテムビューにドラッグ&ドロップがすでにサポートされています。 –
はいドラッグが完全に実装されています。ただし、ドロップが期待通りに機能しません。 QFileSystemModelとファイルブラウザ(イルカ)を組み合わせた 'QListView'を使って簡単なドラッグアンドドロップ実験を試みました。 'QListView'からイルカへのドラッグはすごく効果的ですが、それ以外の方法は受け入れられません。だから私は、ドロップを実行しようとしているウィジェットの 'dragEnterEvent'、' dragMoveEvent'と 'dropEvent'を設定しなければならないと思います。 – Marcus