QTreeWidget の別の部分にドロップされた QTreeWidgetItem からのデータが必要なプログラムを作成しています。ドラッグ アンド ドロップは完全に機能しており、eventFilter で QEvent.Drop タイプのイベントを取得できます。しかし、ドロップされている実際のオブジェクトや、その他のデータを取得できません。
ドロップされているオブジェクトを取得するにはどうすればよいですか?
QTreeWidget の別の部分にドロップされた QTreeWidgetItem からのデータが必要なプログラムを作成しています。ドラッグ アンド ドロップは完全に機能しており、eventFilter で QEvent.Drop タイプのイベントを取得できます。しかし、ドロップされている実際のオブジェクトや、その他のデータを取得できません。
ドロップされているオブジェクトを取得するにはどうすればよいですか?
eventFilter または仮想 dropEvent() メソッドの再実装を介してドロップされる「オブジェクト」(C++ の意味で) を取得することは不可能です。
その理由は、Qt でのドラッグ アンド ドロップの設計はクロス アプリケーションにすることです。つまり、2 つの異なるアプリケーション間で「もの」をドラッグ アンド ドロップできます。したがって、Application1
は で使用される C++ クラスを認識しませんApplication2
。また、その逆も同様です。また、同じクラスが使用されていても、で使用されているアドレスにApplication1
はアクセスできApplication2
ません (OS は、プロセスが別のプロセスのメモリを台無しにすることを許可しません)。そのため、ドラッグ アンド ドロップ イベントには代わりに汎用の「データ」が含まれ、そのタイプと内容は MIME タイプによって決定されます。
そうは言っても、あなたのケースは絶望的ではありません;-)QTreeWidgetItem
オブジェクトは取得できませんが、含まれるデータは取得できます。これを行うには、まず、に含まれるデータを記述するために使用される MIME タイプを取得する必要がありますQTreeWidgetItem
。これらは次の方法でアクセスできます。
QStringList QTreeWidget::mimeTypes() const;
これは保護された関数であるため、 の代わりにQTreeWidget
、それを継承する独自のクラスを使用する必要があり、MyTreeWidget
そこからこのメソッドを呼び出すことができることに注意してください (そして、おそらく他の世界にも伝えることができます)。このメソッドの結果を印刷しqDebug()
て、どのように見えるかを把握することをお勧めします。私の場合、これは MIME タイプが 1 つだけのリストを返します: application/x-qabstractitemmodeldatalist
. あなたも同じだと思いますが、どのように実装されているかはわかりませんので、自分で調べたほうがいいでしょう。
次に、次を使用して、各 MIME タイプに関連付けられたデータにアクセスできます (MIME タイプは 1 つしかないようです...)。
foreach(QString mimeType, mimeTypes)
{
QByteArray array = dropEvent.mimeData()->data(mimeType);
}
またはおそらくただQByteArray array = dropEvent.mimeData()->data("application/x-qabstractitemmodeldatalist");
。
さて、これがどのように見えるか、そして必要な情報を抽出できるかどうかを確認するのはあなた次第です。:)