wxDataViewCtrl и DnD

Я использую wxWidgets 3.0.2 с Gtk в Linux.

Я пытаюсь сделать wxDataViewCtrl целью перетаскивания для операции перетаскивания. Я вывел класс из wxTextDropTarget и затем вызвал wxDataViewCtrl::SetDropTarget(), чтобы сделать экземпляр этого класса целевой для удаления для wxDataViewCtrl.

Однако ничего не происходит. Каждый раз, когда я пытаюсь что-то добавить в wxDataViewCtrl, метод wxDropSource::DoDragDrop() возвращает wxDragCancel. Для моего пользовательского класса wxTextDropTarget я переопределил метод OnEnter() и велел записывать его в stdout "OnEnter()" всякий раз, когда входил в wxDataViewCtrl с чем-то, что нужно уронить, но в stdout ничего не записывается.

Чтобы проверить, что я даже правильно выполняю пользовательский класс wxTextDropTarget и правильно настраиваю источник перетаскивания, я добавил wxTextCtrl в свой графический интерфейс и сделал так, чтобы цель перетаскивания и все работало как ожидалось: wxDropSource::DoDragDrop() вернул wxDragCopy и "OnEnter() "будет записано в стандартный вывод, когда я войду в wxTextCtrl с чем-то, чтобы уронить.

WxDataViewCtrl не поддерживает DnD? Или я что-то пропускаю?

1 ответ

Решение

Просто подумал, что я займусь своим собственным постом на случай, если кто-то столкнется с той же проблемой.

После того, как я написал небольшую тестовую программу для проверки DnD между элементом управления и wxDataViewCtrl и обнаружил, что она работает нормально, я вернулся к своему исходному приложению и еще немного уставился на него, чтобы попытаться понять, что я делал по-другому. Оказывается, мне нужно было вызвать SetDropTarget() в окне PARENT целевого объекта wxDataViewCtrl, а не самого wxDataViewCtrl, т.е. my_data_view_ctrl->GetParent()->SetDropTarget(бла-бла-бла-бла);.

Однако мне не нужно было делать это в моей тестовой программе, поэтому я подумал, что это немного странно. Единственная разница между моей тестовой программой и моей реальной программой заключалась в том, что в моей настоящей программе wxDataViewCtrl внутри wxStaticBoxSizer, и я думаю, что это было проблемой. Я подозреваю, что wxStaticBox (который использует wxStaticBoxSizer) получал уведомление о перетаскивании вместо wxDataViewCtrl, поэтому я должен был установить его SetDropTarget(), а не wxDataViewCtrl.

Другие вопросы по тегам