#include #include #include #include class ListModel : public QAbstractListModel { public: ListModel(QObject * parent = nullptr) : QAbstractListModel {parent} , list {"A", "B", "C", "D"} { } protected: int rowCount(QModelIndex const& index = QModelIndex {}) const override { return index.isValid() ? 0 : list.size(); } QVariant data(QModelIndex const& index, int role) const override { QVariant result; if (Qt::DisplayRole == role) result = list[index.row()]; return result; } Qt::ItemFlags flags(QModelIndex const& index) const override { auto flags = QAbstractListModel::flags(index) | Qt::ItemIsDragEnabled; if (!index.isValid()) flags |= Qt::ItemIsDropEnabled; return flags; } bool setData(QModelIndex const& index, QVariant const& value, int role = Qt::EditRole) override { if (index.isValid() && index.row() < rowCount() && Qt::DisplayRole == role) { list[index.row ()] = value.toString(); Q_EMIT dataChanged(index, index, QVector {role}); return true; } return false; } Qt::DropActions supportedDropActions() const override {return Qt::MoveAction;} bool insertRows(int row, int count, QModelIndex const& parent = QModelIndex {}) override { beginInsertRows(parent, row, row + count - 1); for (int i = 0; i < count; ++i) list.insert(row, {}); endInsertRows(); return true; } bool removeRows(int row, int count, QModelIndex const& parent = QModelIndex {}) override { beginRemoveRows(parent, row, row + count - 1); for (int index = 0; index < count; ++index) list.removeAt(row); endRemoveRows(); return true; } private: QStringList list; }; int main (int argc, char * argv[]) { QApplication controller {argc, argv}; ListModel model; QListView view; view.setModel (&model); view.setDragDropMode (QListView::InternalMove); view.show (); return controller.exec (); }