1

リストウィジェットとツリーウィジェットがあります。listwidgetitems をドラッグ アンド ドロップで listwidget 内に移動できるようにしたいのですが、listwidget が treewidget からドラッグされた項目からのドロップを受け入れるようにしたいのですが、その前に、データに何らかの処理を行いたいと考えています。

今すぐこれらすべてを行うことができますが、ツリーウィジェットから始まるドラッグ イベントにカスタム データを設定する方法を見つけることができません。

たとえば、treewidget に「Add DrawEffect」というテキストと QIcon を含む topLevelItem があり、listwidget 内にドラッグ アンド ドロップすると、次のように listwidget に新しい項目を追加したいと考えています。

DrawEffect 0x0x0x0 effect-here

そしてそうではない

Add DrawEffect (showing its QIcon as well)

このデータはいつ設定する必要がありますか?

これは、listwidget 内で listwidgetitems をドラッグ アンド ドロップするときに完全に正常に動作する、これまでのところ私のコードです。また、listwidget 内で qtreewidgetitems をドラッグ アンド ドロップするときにも機能しますが、追加する前にさらに処理を行いたい場合は、それらをそのままコピーします。

私のツリーウィジェットのコンストラクターで:

this->setDragDropMode(QAbstractItemView::DragOnly);
this->setDefaultDropAction(Qt::CopyAction);

リストウィジェットのコンストラクターで:

this->setAcceptDrops(true);
this->setDragDropMode(QAbstractItemView::DragDrop);
this->setDefaultDropAction(Qt::MoveAction);

listwidget の dropEvent の再実装:

if(event->source()->inherits("QTreeWidget"))
    qDebug() << "The dragged item comes from the TreeWidget.";
else
    qDebug() << "The dragged item comes from the ListWidget itself.";
QListWidget::dropEvent(event);

ご覧のとおり、treewidget アイテムと listwidget アイテムを区別できますが、この後どうすればよいかわかりません...

私はこのようなものがOKだと思います:

if(event->source()->inherits("QTreeWidget")){
    //treewidget item, it needs further processing
}
else
    QListWidget::dropEvent(event); //listwidget item, no further processing needed

ありがとう :/

4

2 に答える 2

4

答えを言うと、cmannett85 が言ったように、ドラッグに入ると、自動的に MIME データがドラッグ イベントに追加されます。QTableWidget::mimeData() をオーバーライドすることで、追加される mimedata をオーバーライドできます。このメソッドでは、その位置にある項目の識別子を設定できます (例: 行番号、列番号、データ構造へのインデックス)

次に、リスト ウィジェットの dropMimedata メソッドをオーバーライドして、ユーザーが追加したこのデータを読み取り、挿入操作を実行します。

QTableWidgetで行をドラッグするときに、FROM と TO にドラッグされた行インデックスを確認するにはどうすればよいですか? 詳細については

于 2012-09-13T14:23:16.120 に答える
1

私の知る限り、ドラッグ操作はアイテムを「含む」のではなく、それを説明するデータを含むだけです。そのため、オブジェクトのテキスト、アイコンなどのデータから新しいアイテムを作成し、event->mimeData()手動でウィジェットに挿入する必要がありますevent->pos()

于 2012-09-13T07:40:11.730 に答える