Qt通过拖放方式在界面中打开文件

拖放打开文件

  1. 窗口界面的setAcceptDrops属性不许设置为true,否则无法接收拖放事件;
  2. QTextEdit的setAcceptDrops属性必须设置为false,否则进行拖放时会进入QTextedit的拖放事件进行响应;
  3. 如果调试时,无法进入重写的拖放事件,请检查setAcceptDrops的属性设置。

mainwindow.h

	#ifndef MAINWINDOW_H
	#define MAINWINDOW_H
	
	#include 
	#include 
	#include 
	#include 
	#include 
	#include 
	#include 
	
	class MainWindow : public QMainWindow
	{
	    Q_OBJECT
	
	public:
	    MainWindow(QWidget *parent = 0);
	    ~MainWindow();
	
	protected:
	    virtual void dragEnterEvent(QDragEnterEvent *event);
	    virtual void dropEvent(QDropEvent *event);
	
	private:
	    QTextEdit *m_pTextEdit;
	};
	
	#endif // MAINWINDOW_H

mainwindow.cpp

	#include "mainwindow.h"
	
	MainWindow::MainWindow(QWidget *parent)
	    : QMainWindow(parent)
	{
	    m_pTextEdit = new QTextEdit;
	    this->layout()->addWidget(m_pTextEdit);
	 this->resize(500, 400);
	
    this->setAcceptDrops(true); //必须设置,不然无法接收拖放事件
    m_pTextEdit->setAcceptDrops(false); //必须设置,不然窗口的拖放事件无法响应,而是去响应QTextEdit的拖放事件
}

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

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 urls = mimeData->urls();
        QString fileName = urls.at(0).toLocalFile();
        QFile file(fileName);
        if(file.open(QIODevice::ReadOnly))
        {
            //读取中文和字符会出错
//            QByteArray text = file.readAll();
//            m_pTextEdit->setText(QString::fromUtf8(text));

            QTextStream stream(&file);
            m_pTextEdit->setText(stream.readAll());
        }
    }
}

你可能感兴趣的:(QT,QTextEdit,Dialog)