Чтобы drop работал не только на item-ах, но и на всем viewport-e, нужно чтобы функция flags всегда возвращала минимум Qt::ItemIsDropEnabled:
Qt::ItemFlags YourModel::flags(const QModelIndex & index) const
{
if (!index.isValid()) return Qt::ItemIsDropEnabled;
...