实现一个将文本文件拖放到textEdit中显示出来的功能
需要重写两个函数:
void dragEnterEvent(QDragEnterEvent * event);
将文件拖动到组件时,系统会回调该函数
void dropEvent(QDropEvent *event);
当松开鼠标后,系统回调该函数
代码
Widget类:
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
private:
bool readFile(const QString &filename);
Ui::Widget *ui;
};
Widget构造函数:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->textEdit->setAcceptDrops(false);
//关闭textEdit的拖放事件
//textEdit默认开启拖放事件
//如果拖入一个文件,那么默认是将文件名(路径)插入到光标位置
setAcceptDrops(true);
//开启widget的拖放事件截取
setWindowTitle("窗口拖放事件");
}
dragEnterEvent(QDragEnterEvent * event):
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
//将文件拖动到组件时,系统会回调该函数
if(event->mimeData()->hasFormat("text/uri-list")){
//此处是过滤文件类型,只有MIME类型为text/uri-list的才可接收
event->acceptProposedAction();
//该函数可以使组件接受文件拖放
}
//关于QMimeData
//MIME 类型为 text/uri-list 通常用来描述一个 URI 列表。
//这些 URI 可以是文件名,可以是 URL 或者其它的资源描述符。
//如果发现用户拖放的是一个 text/uri-list 数据(即文件名)
//那就接受该文件的拖放操作
}
dropEvent(QDropEvent *event):
void Widget::dropEvent(QDropEvent *event)
{
//当松开鼠标时,系统回调该函数
QList<QUrl > urls = event->mimeData()->urls();
if(urls.isEmpty()){
return ;
}
QString filename = urls.first().toLocalFile();
if(filename.isEmpty()){
return ;
}
if(readFile(filename)){
setWindowTitle(tr("%1 - %2").arg(filename, tr("Drag File")));
}
}
readFile(const QString &filename):
bool Widget::readFile(const QString &filename)
{
QFile file(filename);
QString strFile;
if(file.open(QIODevice::ReadOnly)){
strFile = QString::fromLocal8Bit(file.readAll());
//避免中文乱码,转换编码
ui->textEdit->setHtml(strFile);
//将strFile的内容以Html语句写入
//ui.textEdit->setText(strFile);
return true;
}
return false;
}
代码效果:
此处用到的QMimeData
通过使用Mime类型来判断,拖入组件的对象的类型
Mime 类型为 text/uri-list 通常用来描述一个 URI 列表。
这些 URI 可以是文件名,可以是 URL 或者其它的资源描述符。
如果发现用户拖放的是一个 text/uri-list 数据(即文件名)
那就接受该文件的拖放操作