Я хочу переставить набор изображений в qlistview. Я посмотрел на примеры и просто не могу заставить это работать. Когда я перетаскиваю изображение поверх другого изображения, выполняется dropomimedata (), однако его «data-> hasImage ()» всегда ложно. Когда я бросаю изображение в пустое пространство, по какой-то причине dropmimedata () вообще не запускается.
Моя модель должна выглядеть так:
Однако после перетаскивания в пустые места это выглядит так:
И когда я перетаскиваю изображение поверх другого, ничего не меняется, потому что hasImage всегда ложно. Что я делаю неправильно? Что мне не хватает?
#include "spritemodel.h"
#include <QDebug>
#include <QMimeData>
SpriteModel::SpriteModel() : QAbstractListModel()
{
}
void SpriteModel::setContents(QList<QPair<QImage, QOpenGLTexture*>> &newList)
{
beginInsertRows(QModelIndex(), 0, newList.size());
imageList = newList;
endInsertRows();
}
int SpriteModel::rowCount(const QModelIndex & parent) const
{
Q_UNUSED(parent);
return imageList.size();
}
QVariant SpriteModel::data(const QModelIndex & index, int role) const
{
if (role == Qt::DecorationRole)
return imageList[index.row()].first;
else if (role == Qt::DisplayRole)
return "";
else
return QVariant();
}
Qt::DropActions SpriteModel::supportedDropActions() const
{
return Qt::CopyAction | Qt::MoveAction;
}
Qt::ItemFlags SpriteModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index);
if (index.isValid())
return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
else
return Qt::ItemIsDropEnabled | defaultFlags;
}
bool SpriteModel::removeRows(int position, int rows, const QModelIndex &parent)
{
beginRemoveRows(QModelIndex(), position, position+rows-1);
for (int row = 0; row < rows; ++row) {
imageList.removeAt(position);
}
endRemoveRows();
return true;
}
bool SpriteModel::insertRows(int position, int rows, const QModelIndex &parent)
{
beginInsertRows(QModelIndex(), position, position+rows-1);
QImage img(imageList[0].first.width(), imageList[0].first.height(), imageList[0].first.format());
QOpenGLTexture *texture = new QOpenGLTexture(img);
for (int row = 0; row < rows; ++row) {
imageList.insert(position, qMakePair(img, texture));
}
endInsertRows();
return true;
}
bool SpriteModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
QImage img = value.value<QImage>();
QOpenGLTexture *texture = new QOpenGLTexture(img);
if (index.isValid() && role == Qt::EditRole) {
imageList.replace(index.row(), qMakePair(img, texture));
emit dataChanged(index, index);
return true;
}
return false;
}
QMimeData *SpriteModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData();
QByteArray encodedData;
QDataStream stream(&encodedData, QIODevice::WriteOnly);
foreach (const QModelIndex &index, indexes) {
if (index.isValid()) {
QVariant img = data(index, Qt::DecorationRole);
stream << img;
}
}
mimeData->setData("image/png", encodedData);
return mimeData;
}
bool SpriteModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
if (data->hasImage()) {
qDebug() << "wut";
QImage img = qvariant_cast<QImage>(data->imageData());
QOpenGLTexture *texture = new QOpenGLTexture(img);
beginInsertRows(parent, 0, 1); // test
imageList.insert(row, qMakePair(img, texture));
endInsertRows();
emit dataChanged(QModelIndex(),QModelIndex());
return true;
}
return false;
}