#ifndef CONFIG_MGR_H #define CONFIG_MGR_H #include #include #include "cardbase.h" #include #include #include #include #include #include //数据模型类 #include class DraggableListWidget : public QListWidget { public: DraggableListWidget(QWidget *parent = nullptr) : QListWidget(parent) { setDragEnabled(true); } protected: void startDrag(Qt::DropActions supportedActions) override { QListWidgetItem *item = currentItem(); if (!item) return; QMimeData *mimeData = new QMimeData; // 获取显示文本和 UserRole 数据 QString visibleText = item->text(); QString userData = item->data(Qt::UserRole).toString(); // 使用 QDataStream 打包数据 QByteArray data; QDataStream stream(&data, QIODevice::WriteOnly); stream << visibleText << userData; // 包含显示文本和 UserRole 数据 mimeData->setData("application/x-custom", data); // 设置自定义 MIME 数据 QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction); } }; class DropTreeModel : public QStandardItemModel { public: using QStandardItemModel::QStandardItemModel; QStringList mimeTypes() const override { // 支持自定义类型和 QListWidget 默认类型 return { "application/x-custom", "application/x-qabstractitemmodeldatalist" }; } bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override { QStandardItem *parentItem = this->itemFromIndex(parent); if (!parentItem) parentItem = this->invisibleRootItem(); if (data->hasFormat("application/x-custom")) { QByteArray rawData = data->data("application/x-custom"); QString customText = QString::fromUtf8(rawData); QStandardItem *newItem = new QStandardItem(customText); newItem->setData(customText, Qt::UserRole); // 假设 data 也就是内容 newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); if (row < 0) parentItem->appendRow(newItem); else parentItem->insertRow(row, newItem); return true; } if (data->hasFormat("application/x-qabstractitemmodeldatalist")) { QByteArray encoded = data->data("application/x-qabstractitemmodeldatalist"); QDataStream stream(&encoded, QIODevice::ReadOnly); while (!stream.atEnd()) { int r, c; QMap roleDataMap; stream >> r >> c >> roleDataMap; QString text = roleDataMap.value(Qt::DisplayRole).toString(); QVariant userData = roleDataMap.value(Qt::UserRole); QStandardItem *newItem = new QStandardItem(text); newItem->setData(userData, Qt::UserRole); // 保留附加数据 newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); if (row < 0) parentItem->appendRow(newItem); else parentItem->insertRow(row, newItem); } return true; } return false; } Qt::DropActions supportedDropActions() const override { return Qt::CopyAction | Qt::MoveAction; } }; class ConfigMgr { private: static ConfigMgr *instance; ConfigMgr() { for (int i = 0; i < SLOT_NUM; ++i) { card_type_[i] = kCardNone; } } public: int card_type_[15]; static ConfigMgr *Instance() { if (instance == nullptr) { instance = new ConfigMgr(); } return instance; } ~ConfigMgr(); void Save(QString & file_path); void Load(QString filename); std::shared_ptr GetSlotPtr(int slot);//1-15 void AddCard(std::shared_ptr ptr); void RemoveCard(std::shared_ptr ptr); private: QString filename_; std::vector> cards_; }; #endif // CONFIG_MGR_H