4

タイトルが示すように、gtk.TreeViewモデルがソートおよびフィルター処理された があります。ドキュメントによると、「ドラッグ アンド ドロップによる行の並べ替えは、並べ替えられていないストアでのみ機能します。」. 与えられた唯一の他の情報は、外部ソースの使用に関連していますが、この場合は必要ありません。

とにかく、drag-dest の受信信号とドラッグドロップ信号にハンドラーを提供して実装しようとしましたが、それでも次のエラーが発生します。

GtkWarning: GtkTreeDragDest インターフェイスをサポートしないモデルを使用し、ドラッグ アンド ドロップを有効にする場合は、GtkTreeView のデフォルトの 'drag_data_received' ハンドラーをオーバーライドする必要があります。これを行う最も簡単な方法は、'drag_data_received' に接続し、シグナル ハンドラーで g_signal_stop_emission_by_name() を呼び出して、デフォルト ハンドラーが実行されないようにすることです。gtktreeview.c のデフォルト ハンドラのソース コードを見て、ハンドラが何をすべきかを理解してください。(gtktreeview.c は GTK ソース コードにあります。) C 以外の言語から GTK を使用している場合は、派生などを介して、既定のハンドラーをオーバーライドするより自然な方法があるかもしれません。

それにも関わらず、まだ実装していませんが、クラッシュしないので動作させることができそうです。それにもかかわらず、これは私がむしろ受けたくない警告です。

それで、Pythonに相当するものはありg_signal_stop_emission_by_nameますか、それとも私はこれについて間違った方法をとっていますか?

4

3 に答える 3

4

すでに「ドラッグドロップ」ハンドラーを持っていたので少し混乱しましたが、次を実装するとソートされました。

def __init__(self):
    self.treeview.connect("drag_data_received", self.on_drag_data_received)

def on_drag_data_received(self, widget, drag_context, x, y, selection_data, info, timestamp):
    widget.stop_emission('drag_data_received')

pygtk docsによると、 *emit_stop_by_name* と *stop_emission* は同じです。

于 2011-07-08T22:11:04.483 に答える
1

ですgobject.GObject.emit_stop_by_name()。あなたがやっていることが成功するかどうかはわかりませんが、私が考えることができる「標準的な」方法はありません。

自分で実装する代わりに、 Py-gtktreeを使用してみることができます: と呼ばれる例を参照してくださいdrag_between_tree_and_list.py。ツリーを右側に並べ替えても、ドラッグしたアイテムが自動的に「正しい」位置に配置されたまま、ツリーにドラッグすることができます。ツリーのどこにでもドラッグすることはできませんが、別の理由があります。例では明示的にこれを要求しています。

于 2010-06-20T21:28:20.157 に答える
0

独自のドラッグドロップ受信シグナルハンドラーで treeview.stop_emission('drag-drop-received') を使用して、警告を取り除きました。試したことはありませんが、おそらく doublep による方法も機能するでしょう。

于 2010-06-21T06:45:31.513 に答える