Qt实现文件拖拽打开加载的示例详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>Qt实现文件拖拽加载</li><li>基本实现原理</li><li>基本实现步骤</li><ul class="second_class_ul"><li>1. 启用拖拽接受</li><li>2. 重写拖拽事件处理函数</li></ul><li>完整示例代码</li><ul class="second_class_ul"></ul><li>高级特性</li><ul class="second_class_ul"><li>1. 自定义拖拽视觉效果</li><li>2. 多文件处理</li></ul><li>注意事项</li><ul class="second_class_ul"></ul><li>Qt 拖拽功能扩展:程序间拖拽和控件间拖放</li><ul class="second_class_ul"><li>1. 接受其他程序的拖拽</li><ul class="third_class_ul"><li>基本文件拖拽(跨程序)</li><li>支持多种MIME类型</li></ul><li>2. 控件之间的拖放</li><ul class="third_class_ul"><li>启用控件拖放功能</li><li>自定义列表控件拖放</li></ul><li>3. 自定义拖拽数据</li><ul class="third_class_ul"><li>创建自定义MIME数据</li><li>实现自定义拖拽源</li><li>接受自定义拖拽数据的目标控件</li></ul><li>4. 高级拖放示例:在两个列表间拖拽</li><ul class="third_class_ul"></ul><li>5. 拖放操作类型控制</li><ul class="third_class_ul"></ul><li>6. 完整的应用程序示例</li><ul class="third_class_ul"></ul></ul><li>关键要点</li><ul class="second_class_ul"></ul><li>总结</li><ul class="second_class_ul"></ul></ul></div><p>最近事比较多,这个很久之前要整理,一直没发上来,今天必须整理发布</p><p class="maodian"></p><h2>Qt实现文件拖拽加载</h2>
<p><strong>效果:</strong></p>
<p>拖动文件到程序中打开</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122409203092.png" /></p>
<p class="maodian"></p><h2>基本实现原理</h2>
<p>Qt 的文件拖拽功能基于 MIME(Multipurpose Internet Mail Extensions)系统和拖拽事件机制:</p>
<ul><li><strong>拖拽检测</strong>:当用户拖动文件到应用程序窗口时,Qt 会检测到拖拽操作</li><li><strong>MIME 数据处理</strong>:Qt 解析拖拽数据中的 MIME 类型信息</li><li><strong>事件处理</strong>:通过重写拖拽相关事件函数来处理文件拖拽</li></ul>
<p><strong>主要使用函数</strong></p>
<p>Qt 提供了一套的框架实现拖拽支持,<strong>主要有将其拆分成了</strong>拖拽(Drag)<strong>与</strong>放置(Drop) 这两部分</p>
<p><code>dragEnterEvent;</code> <code>dropEvent()</code>函数</p>
<div class="jb51code"><pre class="brush:cpp;">protected:
virtual void dragEnterEvent(QDragEnterEvent* event) override;
virtual void dropEvent(QDropEvent* event) override;
</pre></div>
<p class="maodian"></p><h2>基本实现步骤</h2>
<p class="maodian"></p><h3>1. 启用拖拽接受</h3>
<div class="jb51code"><pre class="brush:cpp;">// 在构造函数或初始化函数中
setAcceptDrops(true);</pre></div>
<p class="maodian"></p><h3>2. 重写拖拽事件处理函数</h3>
<div class="jb51code"><pre class="brush:cpp;">#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QFileInfo>
#include <QDebug></pre></div>
<p>拖拽进入事件</p>
<div class="jb51code"><pre class="brush:cpp;">void Widget::dragEnterEvent(QDragEnterEvent *event)
{
// 检查拖拽数据中是否包含文件
if (event->mimeData()->hasUrls()) {
// 可选:检查文件类型
QList<QUrl> urls = event->mimeData()->urls();
for (const QUrl &url : urls) {
QFileInfo fileInfo(url.toLocalFile());
QString suffix = fileInfo.suffix().toLower();
// 只接受特定类型的文件
if (suffix == "txt" || suffix == "png" || suffix == "jpg") {
event->acceptProposedAction();
return;
}
}
}
// 或者简单接受所有文件
// if (event->mimeData()->hasUrls()) {
// event->acceptProposedAction();
// }
}</pre></div>
<p>拖拽移动事件</p>
<div class="jb51code"><pre class="brush:cpp;">void Widget::dragMoveEvent(QDragMoveEvent *event)
{
if (event->mimeData()->hasUrls()) {
event->acceptProposedAction();
}
}</pre></div>
<p>拖拽离开事件</p>
<div class="jb51code"><pre class="brush:cpp;">void Widget::dragLeaveEvent(QDragLeaveEvent *event)
{
event->accept();
}</pre></div>
<p>放置事件处理</p>
<div class="jb51code"><pre class="brush:cpp;">void Widget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasUrls()) {
QList<QUrl> urls = event->mimeData()->urls();
for (const QUrl &url : urls) {
QString filePath = url.toLocalFile();
QFileInfo fileInfo(filePath);
if (fileInfo.isFile()) {
// 处理文件
handleDroppedFile(filePath);
} else if (fileInfo.isDir()) {
// 处理文件夹
handleDroppedDirectory(filePath);
}
}
event->acceptProposedAction();
}
}</pre></div>
<p class="maodian"></p><h2>完整示例代码</h2>
<div class="jb51code"><pre class="brush:cpp;">#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include <QTextEdit>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
protected:
void dragEnterEvent(QDragEnterEvent *event) override;
void dragMoveEvent(QDragMoveEvent *event) override;
void dropEvent(QDropEvent *event) override;
private:
QTextEdit *textEdit;
QLabel *statusLabel;
void handleDroppedFile(const QString &filePath);
void loadTextFile(const QString &filePath);
void loadImageFile(const QString &filePath);
};
#endif</pre></div>
<p><strong>实现文件</strong></p>
<div class="jb51code"><pre class="brush:cpp;">#include "mainwindow.h"
#include <QVBoxLayout>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QUrl>
#include <QFileInfo>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QPixmap>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 设置窗口属性
setWindowTitle("文件拖拽加载示例");
setMinimumSize(600, 400);
// 创建中央部件
QWidget *centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
// 创建界面组件
textEdit = new QTextEdit(this);
textEdit->setPlaceholderText("将文件拖拽到此处...");
statusLabel = new QLabel("准备就绪", this);
// 布局
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
layout->addWidget(textEdit);
layout->addWidget(statusLabel);
// 启用拖拽接受
setAcceptDrops(true);
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasUrls()) {
// 检查文件类型
QList<QUrl> urls = event->mimeData()->urls();
for (const QUrl &url : urls) {
QFileInfo fileInfo(url.toLocalFile());
QString suffix = fileInfo.suffix().toLower();
// 接受文本和图片文件
if (suffix == "txt" || suffix == "png" || suffix == "jpg"
|| suffix == "jpeg" || suffix == "bmp") {
event->acceptProposedAction();
return;
}
}
}
}
void MainWindow::dragMoveEvent(QDragMoveEvent *event)
{
if (event->mimeData()->hasUrls()) {
event->acceptProposedAction();
}
}
void MainWindow::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasUrls()) {
QList<QUrl> urls = event->mimeData()->urls();
for (const QUrl &url : urls) {
QString filePath = url.toLocalFile();
handleDroppedFile(filePath);
}
event->acceptProposedAction();
}
}
void MainWindow::handleDroppedFile(const QString &filePath)
{
QFileInfo fileInfo(filePath);
if (!fileInfo.exists()) {
statusLabel->setText("文件不存在: " + filePath);
return;
}
QString suffix = fileInfo.suffix().toLower();
if (suffix == "txt") {
loadTextFile(filePath);
} else if (suffix == "png" || suffix == "jpg" || suffix == "jpeg" || suffix == "bmp") {
loadImageFile(filePath);
} else {
statusLabel->setText("不支持的文件类型: " + suffix);
}
}
void MainWindow::loadTextFile(const QString &filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
statusLabel->setText("无法打开文件: " + filePath);
return;
}
QTextStream in(&file);
QString content = in.readAll();
file.close();
textEdit->setPlainText(content);
statusLabel->setText("已加载文本文件: " + filePath);
}
void MainWindow::loadImageFile(const QString &filePath)
{
QPixmap pixmap(filePath);
if (pixmap.isNull()) {
statusLabel->setText("无法加载图片: " + filePath);
return;
}
// 在文本编辑器中显示图片(简单示例)
textEdit->clear();
textEdit->append(QString("图片文件: %1\n尺寸: %2 x %3")
.arg(filePath)
.arg(pixmap.width())
.arg(pixmap.height()));
statusLabel->setText("已加载图片文件: " + filePath);
}</pre></div>
<p class="maodian"></p><h2>高级特性</h2>
<p class="maodian"></p><h3>1. 自定义拖拽视觉效果</h3>
<div class="jb51code"><pre class="brush:cpp;">void Widget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasUrls()) {
// 改变外观提示用户
setStyleSheet("background-color: #e0e0e0; border: 2px dashed #666;");
event->acceptProposedAction();
}
}
void Widget::dragLeaveEvent(QDragLeaveEvent *event)
{
// 恢复正常外观
setStyleSheet("");
event->accept();
}
void Widget::dropEvent(QDropEvent *event)
{
// 恢复正常外观
setStyleSheet("");
// ... 处理文件
}</pre></div>
<p class="maodian"></p><h3>2. 多文件处理</h3>
<div class="jb51code"><pre class="brush:cpp;">void Widget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasUrls()) {
QStringList filePaths;
QList<QUrl> urls = event->mimeData()->urls();
for (const QUrl &url : urls) {
filePaths.append(url.toLocalFile());
}
// 批量处理文件
processMultipleFiles(filePaths);
event->acceptProposedAction();
}
}</pre></div>
<p class="maodian"></p><h2>注意事项</h2>
<ul><li><strong>权限问题</strong>:确保应用程序有读取拖拽文件的权限</li><li><strong>文件类型验证</strong>:始终验证文件类型和内容,避免安全风险</li><li><strong>大文件处理</strong>:对于大文件,考虑使用异步加载</li><li><strong>错误处理</strong>:完善的错误处理机制,提供用户友好的提示</li></ul>
<p class="maodian"></p><h2>Qt 拖拽功能扩展:程序间拖拽和控件间拖放</h2>
<p class="maodian"></p><h3>1. 接受其他程序的拖拽</h3>
<p class="maodian"></p><h4>基本文件拖拽(跨程序)</h4>
<div class="jb51code"><pre class="brush:cpp;">class FileDropWidget : public QWidget
{
protected:
void dragEnterEvent(QDragEnterEvent *event) override
{
// 检查是否有URLs(文件)或特定MIME类型
if (event->mimeData()->hasUrls() ||
event->mimeData()->hasFormat("text/plain")) {
event->acceptProposedAction();
}
}
void dropEvent(QDropEvent *event) override
{
const QMimeData *mimeData = event->mimeData();
// 处理文件拖拽
if (mimeData->hasUrls()) {
QList<QUrl> urls = mimeData->urls();
for (const QUrl &url : urls) {
QString filePath = url.toLocalFile();
qDebug() << "拖拽文件:" << filePath;
}
}
// 处理文本拖拽
if (mimeData->hasText()) {
QString text = mimeData->text();
qDebug() << "拖拽文本:" << text;
}
event->acceptProposedAction();
}
};</pre></div>
<p class="maodian"></p><h4>支持多种MIME类型</h4>
<div class="jb51code"><pre class="brush:cpp;">void AdvancedDropWidget::dragEnterEvent(QDragEnterEvent *event)
{
const QMimeData *mimeData = event->mimeData();
// 支持的文件类型
QStringList supportedFormats;
supportedFormats << "text/uri-list" << "text/plain"
<< "text/html" << "image/png"
<< "application/x-color";
for (const QString &format : supportedFormats) {
if (mimeData->hasFormat(format)) {
event->acceptProposedAction();
return;
}
}
}
void AdvancedDropWidget::dropEvent(QDropEvent *event)
{
const QMimeData *mimeData = event->mimeData();
if (mimeData->hasUrls()) {
// 处理文件
handleFiles(mimeData->urls());
}
else if (mimeData->hasText()) {
// 处理纯文本
handleText(mimeData->text());
}
else if (mimeData->hasHtml()) {
// 处理HTML
handleHtml(mimeData->html());
}
else if (mimeData->hasImage()) {
// 处理图片
handleImage(qvariant_cast<QPixmap>(mimeData->imageData()));
}
else if (mimeData->hasColor()) {
// 处理颜色
handleColor(qvariant_cast<QColor>(mimeData->colorData()));
}
event->acceptProposedAction();
}</pre></div>
<p class="maodian"></p><h3>2. 控件之间的拖放</h3>
<p class="maodian"></p><h4>启用控件拖放功能</h4>
<div class="jb51code"><pre class="brush:cpp;">// 设置控件可拖拽
ui->listWidget->setDragEnabled(true);
ui->listWidget->setAcceptDrops(true);
ui->listWidget->setDragDropMode(QAbstractItemView::DragDrop);
// 设置控件可接受拖放
ui->treeWidget->setAcceptDrops(true);
ui->treeWidget->setDragDropMode(QAbstractItemView::DropOnly);</pre></div>
<p class="maodian"></p><h4>自定义列表控件拖放</h4>
<div class="jb51code"><pre class="brush:cpp;">class DragDropListWidget : public QListWidget
{
public:
DragDropListWidget(QWidget *parent = nullptr) : QListWidget(parent)
{
setDragEnabled(true);
setAcceptDrops(true);
setDropIndicatorShown(true);
setDragDropMode(QAbstractItemView::InternalMove);
}
protected:
void dragEnterEvent(QDragEnterEvent *event) override
{
if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) {
event->acceptProposedAction();
}
}
void dragMoveEvent(QDragMoveEvent *event) override
{
event->acceptProposedAction();
}
void dropEvent(QDropEvent *event) override
{
if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) {
QListWidget::dropEvent(event);
event->acceptProposedAction();
// 自定义处理逻辑
handleItemsReordered();
}
}
};</pre></div>
<p class="maodian"></p><h3>3. 自定义拖拽数据</h3>
<p class="maodian"></p><h4>创建自定义MIME数据</h4>
<div class="jb51code"><pre class="brush:cpp;">class CustomMimeData : public QMimeData
{
Q_OBJECT
public:
void setCustomData(const QVariant &data) {
m_customData = data;
setData("application/x-custom-data", QByteArray());
}
QVariant customData() const { return m_customData; }
QStringList formats() const override {
return QStringList() << "application/x-custom-data";
}
protected:
QVariant retrieveData(const QString &mimeType,
QVariant::Type type) const override {
if (mimeType == "application/x-custom-data") {
return m_customData;
}
return QVariant();
}
private:
QVariant m_customData;
};</pre></div>
<p class="maodian"></p><h4>实现自定义拖拽源</h4>
<div class="jb51code"><pre class="brush:cpp;">class DraggableLabel : public QLabel
{
public:
DraggableLabel(const QString &text, QWidget *parent = nullptr)
: QLabel(text, parent)
{
setAlignment(Qt::AlignCenter);
setFrameStyle(QFrame::Box);
setMinimumSize(100, 30);
}
protected:
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_dragStartPosition = event->pos();
}
QLabel::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (!(event->buttons() & Qt::LeftButton)) return;
if ((event->pos() - m_dragStartPosition).manhattanLength()
< QApplication::startDragDistance()) return;
QDrag *drag = new QDrag(this);
CustomMimeData *mimeData = new CustomMimeData;
// 设置自定义数据
QVariantMap customData;
customData["text"] = text();
customData["source"] = "DraggableLabel";
customData["timestamp"] = QDateTime::currentDateTime();
mimeData->setCustomData(customData);
drag->setMimeData(mimeData);
// 设置拖拽时的预览图像
QPixmap pixmap(size());
render(&pixmap);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos());
// 执行拖拽
Qt::DropAction result = drag->exec(Qt::CopyAction | Qt::MoveAction);
if (result == Qt::MoveAction) {
// 如果是移动操作,清除源数据
clear();
}
}
private:
QPoint m_dragStartPosition;
};</pre></div>
<p class="maodian"></p><h4>接受自定义拖拽数据的目标控件</h4>
<div class="jb51code"><pre class="brush:cpp;">class DropTargetWidget : public QWidget
{
public:
DropTargetWidget(QWidget *parent = nullptr) : QWidget(parent)
{
setAcceptDrops(true);
setStyleSheet("border: 2px dashed gray; background-color: white;");
}
protected:
void dragEnterEvent(QDragEnterEvent *event) override
{
if (event->mimeData()->hasFormat("application/x-custom-data")) {
event->acceptProposedAction();
setStyleSheet("border: 2px dashed blue; background-color: #e0e0ff;");
}
}
void dragLeaveEvent(QDragLeaveEvent *event) override
{
setStyleSheet("border: 2px dashed gray; background-color: white;");
event->accept();
}
void dropEvent(QDropEvent *event) override
{
if (event->mimeData()->hasFormat("application/x-custom-data")) {
const CustomMimeData *customMimeData =
qobject_cast<const CustomMimeData*>(event->mimeData());
if (customMimeData) {
QVariant data = customMimeData->customData();
if (data.canConvert<QVariantMap>()) {
QVariantMap customData = data.toMap();
handleCustomDrop(customData, event->pos());
}
}
event->acceptProposedAction();
}
setStyleSheet("border: 2px dashed gray; background-color: white;");
}
private:
void handleCustomDrop(const QVariantMap &data, const QPoint &pos)
{
QString text = data["text"].toString();
QString source = data["source"].toString();
QDateTime timestamp = data["timestamp"].toDateTime();
qDebug() << "接收到自定义拖拽数据:";
qDebug() << "文本:" << text;
qDebug() << "来源:" << source;
qDebug() << "时间:" << timestamp.toString();
qDebug() << "位置:" << pos;
// 创建显示标签
QLabel *label = new QLabel(text, this);
label->setFrameStyle(QFrame::Box);
label->move(pos);
label->show();
label->adjustSize();
}
};</pre></div>
<p class="maodian"></p><h3>4. 高级拖放示例:在两个列表间拖拽</h3>
<div class="jb51code"><pre class="brush:cpp;">class DragDropManager : public QObject
{
Q_OBJECT
public:
DragDropManager(QListWidget *sourceList, QListWidget *targetList)
{
// 源列表设置
sourceList->setDragEnabled(true);
sourceList->setSelectionMode(QAbstractItemView::SingleSelection);
// 目标列表设置
targetList->setAcceptDrops(true);
targetList->setDropIndicatorShown(true);
// 连接信号
connect(sourceList, &QListWidget::itemDoubleClicked,
this, &DragDropManager::onItemDoubleClicked);
}
private slots:
void onItemDoubleClicked(QListWidgetItem *item)
{
// 双击移动项目
QListWidget *sourceList = qobject_cast<QListWidget*>(sender());
if (sourceList && sourceList->parentWidget()) {
// 查找目标列表
QListWidget *targetList = sourceList->parentWidget()
->findChild<QListWidget*>(QString(), Qt::FindDirectChildrenOnly);
if (targetList && targetList != sourceList) {
moveItem(sourceList, targetList, item);
}
}
}
private:
void moveItem(QListWidget *source, QListWidget *target, QListWidgetItem *item)
{
// 创建新项目
QListWidgetItem *newItem = new QListWidgetItem(item->text());
newItem->setData(Qt::UserRole, item->data(Qt::UserRole));
// 添加到目标列表
target->addItem(newItem);
// 从源列表删除
delete source->takeItem(source->row(item));
}
};</pre></div>
<p class="maodian"></p><h3>5. 拖放操作类型控制</h3>
<div class="jb51code"><pre class="brush:cpp;">void CustomWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("application/x-custom-data")) {
// 根据条件决定接受的操作类型
if (event->keyboardModifiers() & Qt::ControlModifier) {
event->setDropAction(Qt::CopyAction);
} else {
event->setDropAction(Qt::MoveAction);
}
event->accept();
}
}
void CustomWidget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("application/x-custom-data")) {
// 根据拖拽时的修饰键决定最终操作
if (event->keyboardModifiers() & Qt::ControlModifier) {
event->setDropAction(Qt::CopyAction);
handleCopyOperation(event);
} else {
event->setDropAction(Qt::MoveAction);
handleMoveOperation(event);
}
event->accept();
}
}</pre></div>
<p class="maodian"></p><h3>6. 完整的应用程序示例</h3>
<div class="jb51code"><pre class="brush:cpp;">class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow()
{
setupUI();
setupDragDrop();
}
private:
void setupUI()
{
// 创建源列表
sourceList = new QListWidget;
sourceList->addItems({"项目1", "项目2", "项目3", "项目4"});
// 创建目标区域
dropArea = new DropTargetWidget;
// 布局
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(sourceList);
layout->addWidget(dropArea);
QWidget *centralWidget = new QWidget;
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
}
void setupDragDrop()
{
// 源列表启用拖拽
sourceList->setDragEnabled(true);
// 可以添加自定义拖拽逻辑
sourceList->setContextMenuPolicy(Qt::CustomContextMenu);
connect(sourceList, &QListWidget::customContextMenuRequested,
this, &MainWindow::onSourceListContextMenu);
}
private slots:
void onSourceListContextMenu(const QPoint &pos)
{
QMenu menu;
QAction *dragAction = menu.addAction("开始拖拽");
if (menu.exec(sourceList->mapToGlobal(pos)) == dragAction) {
startCustomDrag(sourceList->itemAt(pos));
}
}
void startCustomDrag(QListWidgetItem *item)
{
if (!item) return;
QDrag *drag = new QDrag(sourceList);
CustomMimeData *mimeData = new CustomMimeData;
QVariantMap data;
data["type"] = "list_item";
data["content"] = item->text();
data["source"] = "source_list";
mimeData->setCustomData(data);
drag->setMimeData(mimeData);
// 执行拖拽
drag->exec(Qt::CopyAction | Qt::MoveAction);
}
private:
QListWidget *sourceList;
DropTargetWidget *dropArea;
};</pre></div>
<p class="maodian"></p><h2>关键要点</h2>
<ul><li><strong>MIME类型</strong>:跨程序拖拽依赖标准的MIME类型</li><li><strong>数据序列化</strong>:自定义数据需要正确序列化</li><li><strong>视觉反馈</strong>:提供清晰的拖拽视觉反馈</li><li><strong>操作控制</strong>:支持Copy、Move、Link等不同操作类型</li><li><strong>错误处理</strong>:处理不兼容的拖拽数据</li></ul>
<p>这种实现方式支持复杂的拖拽场景,包括程序间数据交换和控件间的灵活交互。</p>
<p class="maodian"></p><h2>总结</h2>
<p>拖放是在应用程序之间传递数据的有力机制。但是在某些情况下; 有可能在执行拖放时并未使用Qt的拖放工具。如果只是想在一个应用程序的窗口部件中移动数据,通常只要重新实现mousePressEvent()和 mouseReleaseEvent()函数就可以了。</p>
<p>以上就是Qt实现文件拖拽打开加载的示例详解的详细内容,更多关于Qt文件拖拽的资料请关注琼殿技术社区其它相关文章!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>Python中PyQt5可视化界面通过拖拽来上传文件的实现</li><li>Qt实现拖拽功能图文教程(支持拖放文件、拖放操作)</li><li>QT实现多文件拖拽获取路径的方法</li><li>Qt利用QDrag实现拖拽拼图功能详解</li><li>Qt自定义图形实现拖拽效果</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]