Qt 中的拖放问题

问题描述 投票:0回答:1

我在 MainWindow 类中重写了

dragEnterEvent()
dropEvent()
,并在构造函数中调用 setAcceptDrops() 。运行时,我将 .txt 文件拖到文本编辑器中,但它没有显示该 .txt 的内容。相反,它显示该 .txt 的路径。请有人帮助我做错的地方。谢谢。

//Header
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

块引用

//Source
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDragEnterEvent>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <QMimeData>
#include <QList>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setAcceptDrops(true);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::dragEnterEvent(QDragEnterEvent *event){
    if(event->mimeData()->hasUrls())
        event->acceptProposedAction();
    else event->ignore();
}

void MainWindow::dropEvent(QDropEvent *event){
    const QMimeData *mimeData = event->mimeData();
    if(mimeData->hasUrls()){
        QList<QUrl> urlList = mimeData->urls();
        QString fileName = urlList.at(0).toLocalFile();
        if(! fileName.isEmpty()){
            QFile file(fileName);
            if(!file.open(QIODevice::ReadOnly))return;
            QTextStream in(&file);
            ui->textEdit->setText(in.readAll());
        }
    }
}

qt drag
1个回答
1
投票

您会看到此行为,因为 QTextEdit 上启用了放置并且事件在那里被消耗。 (默认情况下,TextEdit 将文件名复制到文本区域。) 在您的构造函数中,通过使用

禁用 TextEdit 上的拖放
ui->textEdit->setAcceptDrops(false)

然后该事件将由MainWindow中的dropEvent方法处理

© www.soinside.com 2019 - 2024. All rights reserved.