v1.1.4: 修复拖拽 JSON 文件打开工程功能

【Bug 修复】
- setAcceptDrops(true) —— 之前从未设置,导致所有拖拽事件直接被 Qt 忽略
- 新增 dragMoveEvent 覆写 —— 拖拽移动过程也要 accept,否则 dropEvent 不会触发
- 禁用所有子控件的拖拽接收 —— QTreeWidget/QListWidget/QLineEdit
  等默认接受拖拽,会先拦截事件导致 MainWindow 收不到
- 同时对 viewport() 禁用拖拽,防止内部滚动区域拦截
This commit is contained in:
虾哥
2026-04-28 19:03:49 +08:00
parent 6b582636c9
commit 8616776a24
2 changed files with 39 additions and 0 deletions

View File

@@ -19,6 +19,7 @@
#include <QDir>
#include <QScrollBar>
#include <QDragEnterEvent>
#include <QDragMoveEvent>
#include <QDropEvent>
#include <QMimeData>
@@ -30,6 +31,9 @@ MainWindow::MainWindow(QWidget *parent)
config = new ProjectConfig(this);
cmakeGenerator = new CMakeGenerator(this);
// ★ 启用拖拽
setAcceptDrops(true);
setupUI();
setupConnections();
updateWindowTitle();
@@ -276,6 +280,22 @@ void MainWindow::setupUI()
// 状态栏
statusBar()->showMessage("就绪");
// ★ 禁用子控件的拖拽,让所有拖拽事件由 MainWindow 统一处理
sourceTree->setAcceptDrops(false);
sourceTree->viewport()->setAcceptDrops(false);
includeDirList->setAcceptDrops(false);
includeDirList->viewport()->setAcceptDrops(false);
libraryList->setAcceptDrops(false);
libraryList->viewport()->setAcceptDrops(false);
defineList->setAcceptDrops(false);
defineList->viewport()->setAcceptDrops(false);
optionList->setAcceptDrops(false);
optionList->viewport()->setAcceptDrops(false);
projectNameEdit->setAcceptDrops(false);
compilerPathEdit->setAcceptDrops(false);
assemblerPathEdit->setAcceptDrops(false);
linkerPathEdit->setAcceptDrops(false);
}
void MainWindow::setupConnections()
@@ -350,9 +370,27 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *event)
if (file.endsWith(".json", Qt::CaseInsensitive)) {
event->acceptProposedAction();
statusBar()->showMessage("📂 释放鼠标打开工程:" + file, 3000);
return;
}
}
}
event->ignore();
}
void MainWindow::dragMoveEvent(QDragMoveEvent *event)
{
// 拖拽移动时也要接受,否则 Qt 不会触发 dropEvent
if (event->mimeData()->hasUrls()) {
QList<QUrl> urls = event->mimeData()->urls();
if (!urls.isEmpty()) {
QString file = urls.first().toLocalFile();
if (file.endsWith(".json", Qt::CaseInsensitive)) {
event->acceptProposedAction();
return;
}
}
}
event->ignore();
}
void MainWindow::dropEvent(QDropEvent *event)

View File

@@ -69,6 +69,7 @@ private slots:
protected:
void dragEnterEvent(QDragEnterEvent *event) override;
void dragMoveEvent(QDragMoveEvent *event) override;
void dropEvent(QDropEvent *event) override;
private: