在Qt中拖放问题

时间:2016-08-06 09:09:04

标签: qt drag

我在我的MainWindow类中重载dragEnterEvent()和dropEvent(),并在构造函数中调用setAcceptDrops()。在运行时,我将.txt文件拖到texteditor中,但它没有显示该.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());
        }
    }
}

enter image description here

1 个答案:

答案 0 :(得分:1)

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

禁用TextEdit
ui->textEdit->setAcceptDrops(false)

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