MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*注册监听对象(事件过滤器)*/
ui->pBt_plan1->installEventFilter(this);
ui->pBt_plan2->installEventFilter(this);
ui->pBt_plan3->installEventFilter(this);
ui->pBt_plan4->installEventFilter(this);
ui->pBt_plan5->installEventFilter(this);
ui->pBt_plan6->installEventFilter(this);
ui->pBt_plan7->installEventFilter(this);
ui->pBt_plan8->installEventFilter(this);
// 启用拖拽接受
setAcceptDrops(true);
gridLayout = qobject_cast<QGridLayout*>(ui->widget_all->layout());
buttonList.clear();
buttonList.append(ui->pBt_plan1);
buttonList.append(ui->pBt_plan2);
buttonList.append(ui->pBt_plan3);
buttonList.append(ui->pBt_plan4);
buttonList.append(ui->pBt_plan5);
buttonList.append(ui->pBt_plan6);
buttonList.append(ui->pBt_plan7);
buttonList.append(ui->pBt_plan8);
// for (int i = 0; i < 8; ++i) {
// QPushButton *button = findChild<QPushButton*>(QString("pushButton_%1").arg(i+1));
// if (button) {
// buttonList.append(pBt_plan1);
// button->installEventFilter(this);
// button->setMouseTracking(true);
// }
// }
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
for (int i = 0; i < buttonList.size(); ++i) {
if (obj == buttonList[i]) {
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if (mouseEvent->button() == Qt::LeftButton) {
dragStartPosition = mouseEvent->pos();
draggedButtonIndex = i;
}
}
else if (event->type() == QEvent::MouseMove) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if (!(mouseEvent->buttons() & Qt::LeftButton)) return false;
if ((mouseEvent->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance()) return false;
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-button", QByteArray::number(i));
drag->setMimeData(mimeData);
Qt::DropAction dropAction = drag->exec(Qt::MoveAction);
return true;
}
}
}
return QMainWindow::eventFilter(obj, event);
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("application/x-button")) {
event->acceptProposedAction();
}
}
void MainWindow::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("application/x-button")) {
int fromIndex = event->mimeData()->data("application/x-button").toInt();
QPoint dropPos = event->pos();
int toIndex = -1;
QGridLayout *gridLayout = qobject_cast<QGridLayout*>(ui->widget_all->layout());
if (!gridLayout) return;
for (int i = 0; i < buttonList.size(); ++i) {
QWidget *widget = buttonList[i];
QPoint widgetPos = widget->mapFromGlobal(this->mapToGlobal(dropPos));
if (widget->rect().contains(widgetPos)) {
toIndex = i;
break;
}
}
if (toIndex != -1 && fromIndex != toIndex) {
swapButtons(fromIndex, toIndex);
event->acceptProposedAction();
}
}
}
void MainWindow::swapButtons(int fromIndex, int toIndex)
{
if (fromIndex < 0 || toIndex < 0 || fromIndex >= buttonList.size() || toIndex >= buttonList.size()) return;
QPushButton *fromButton = buttonList[fromIndex];
QPushButton *toButton = buttonList[toIndex];
buttonList[fromIndex] = toButton;
buttonList[toIndex] = fromButton;
updateButtonLayout(fromButton,toButton);
}
void MainWindow::updateButtonLayout(QPushButton *fromButton, QPushButton *toButton)
{
QGridLayout *gridLayout = qobject_cast<QGridLayout*>(ui->widget_all->layout());
if (!gridLayout) return;
// QLayoutItem *child;
// while ((child = gridLayout->takeAt(0)) != nullptr) {
// delete child;
// }
// for (int i = 0; i < buttonList.size(); ++i) {
// gridLayout->addWidget(buttonList[i], 0, (i % 8) + 1);
// }
// 获取两个按钮的位置信息
int index1 = gridLayout->indexOf(fromButton);
int index2 = gridLayout->indexOf(toButton);
int row1, col1, rowSpan1, colSpan1;
int row2, col2, rowSpan2, colSpan2;
gridLayout->getItemPosition(index1, &row1, &col1, &rowSpan1, &colSpan1);
gridLayout->getItemPosition(index2, &row2, &col2, &rowSpan2, &colSpan2);
// 从布局中移除按钮
gridLayout->removeWidget(fromButton);
gridLayout->removeWidget(toButton);
// 交换位置后重新添加
gridLayout->addWidget(fromButton, row2, col2, rowSpan2, colSpan2);
gridLayout->addWidget(toButton, row1, col1, rowSpan1, colSpan1);
}修改为移动时,其他位置的按钮往前或往后顶替掉按钮原来的位置,而不是两个按钮互换位置