I've figured out most of my problem. I'm still not sure about the weirdness when QTreeWidget::supportedDropActions() is reimplemented, but I've got the rest of it. I'm posting my solution because I've seen other related questions and I think that my solution might lead to an answer for a few people.

  1. In addition to reimplementing QListWidget::mimeData() and QTreeWidget::dropMimeData(), I needed to reimplement mimeTypes() in both classes. This was well-documented in the http://doc.qt.io/qt-4.8/model-view-programming documentation, but apparently I can't read.
  2. Using QTreeWidget::setDragDropMode() to set the drag/drop mode to QAbstractItemView::DragDrop is important for receiving drag/drop events from the list widget as well as allowing internal drag and drop (within the tree widget).
  3. I also had to reimplement QTreeWidget::mimeData() so that internal drag and drop events in the tree widget would be handled properly. This probably wasn't entirely necessary, but I think it simplified forcing internal drag and drop events to be move actions later.
  4. At this stage, drag and drop worked, but only to copy items. Reimplementing QTreeWidget::supportedDropActions() to allow only Qt::MoveAction did NOT work. As stated above, it just resulted in items being deleted that shouldn't have been... I'm pretty sure this is a Qt bug (I'm using Qt 4.8).
  5. Getting my whole setup to move things (as opposed to copying) required reimplementing QListWidget::startDrag() QTreeWidget::startDrag() in order to create QDrag instances that executed MoveActions.


Without further ado, here's a working example!

MyDialog.cpp
MyDialog.h
main.cpp
dropMimeData.pro