QDrag 实现拖动排序逻辑实例
时间: 2024-04-08 22:28:51 浏览: 57
拖动排序demo
5星 · 资源好评率100%
下面是一个使用 QDrag 实现拖动排序逻辑的简单示例:
```cpp
#include <QtWidgets>
class MyItemWidget : public QLabel {
public:
MyItemWidget(int index, QWidget *parent = nullptr) : QLabel(parent), itemIndex(index) {
setText(QString("Item %1").arg(itemIndex));
setAutoFillBackground(true);
setAlignment(Qt::AlignCenter);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
setStyleSheet("QLabel { background-color: lightblue; border: 1px solid black; }");
setAcceptDrops(true);
}
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-myitemdata", QByteArray::number(itemIndex));
drag->setMimeData(mimeData);
drag->setPixmap(QPixmap(":/icons/item.png"));
drag->exec(Qt::MoveAction);
}
}
void dragEnterEvent(QDragEnterEvent *event) override {
if (event->mimeData()->hasFormat("application/x-myitemdata")) {
event->acceptProposedAction();
}
}
void dropEvent(QDropEvent *event) override {
if (event->mimeData()->hasFormat("application/x-myitemdata")) {
QByteArray itemData = event->mimeData()->data("application/x-myitemdata");
int droppedIndex = itemData.toInt();
// 处理拖动排序逻辑
emit itemDropped(droppedIndex, itemIndex);
event->acceptProposedAction();
}
}
signals:
void itemDropped(int fromIndex, int toIndex);
private:
int itemIndex;
};
class MainWindow : public QMainWindow {
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
setWindowTitle("Item Sort Example");
QVBoxLayout *layout = new QVBoxLayout;
QWidget *centralWidget = new QWidget;
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
for (int i = 0; i < 5; ++i) {
MyItemWidget *itemWidget = new MyItemWidget(i);
layout->addWidget(itemWidget);
connect(itemWidget, &MyItemWidget::itemDropped, this, &MainWindow::handleItemDropped);
}
}
private:
void handleItemDropped(int fromIndex, int toIndex) {
// 处理拖动排序逻辑,例如交换 item 的位置等
QWidget *centralWidget = this->centralWidget();
QLayout *layout = centralWidget->layout();
QLayoutItem *fromItem = layout->takeAt(fromIndex);
QLayoutItem *toItem = layout->takeAt(toIndex);
layout->insertItem(toIndex, fromItem);
layout->insertItem(fromIndex, toItem);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 加载图标资源
QPixmap::fromImage(QImage(":/icons/item.png"));
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
```
在这个示例中,我们创建了一个简单的主窗口,其中包含了 5 个可拖动的 item。当拖动一个 item 到另一个 item 上时,会发出 `itemDropped` 信号,并在 `MainWindow` 的槽函数 `handleItemDropped` 中处理拖动排序逻辑。通过交换 item 在布局中的位置,实现了拖动排序的效果。
注意:这个示例是一个最简单的实现,仅用于演示拖动排序的基本思路。在实际应用中,你可能需要根据自己的需求进行适当的修改和扩展。
阅读全文