QGIS二次开发,拖放打开文件(Qt基本控件也适用)

14 篇文章 35 订阅

       为了将自己写的程序平时更好用更人性化,其中拖放打开文件是软件一个不可少的功能,有了这个功能免去了打开按钮再找文件对应路径的麻烦,虽然本文中介绍的是QGIS二次开发内容中的一部分,但是用的是Qt功能,所以也适用Qt中控件打开某种格式的文件,下面就介绍如何写这个功能。

      拖放功能事件的完成是由两个响应事件完成,分别为 QDragEnterEvent 与QDropEvent。这两个事件函数为虚函数,所以需要自己申明后再定义。QGIS支持打开的文件格式很多,在这里就涉及了几种格式分别为: "tif" 、 "tiff" 、 "hdf" 、 "shp" 、 "qgs" 、 "qgz" 、 "jpg" 、 "png" 、 "bmp",下面会把支持的格式放入一个列表formatList中。

1.在头文件(myWidget.h)中申明函数与变量。

protected:
	void dragEnterEvent(QDragEnterEvent *event);
	void dropEvent(QDropEvent *event);
private:
QStringList formatList;

2.在主文件中(myWidget.cpp)中定义函数与变量

//允许窗口可以拖入文件(放入主窗口构造函数中)
this->setAcceptDrops(true);
void myWidget::dragEnterEvent(QDragEnterEvent *event)
{
	QList< QUrl> urs;
	urs = event->mimeData()->urls();
	// 判断是否存在可打开的文件
	for (int i=0;i<urs.size();i++)
	{
		QFileInfo fileInfo(urs[i].toLocalFile());
		if (formatList.contains(fileInfo.suffix()))
		{
			event->acceptProposedAction();
			break;
		}
		event->ignore();
	}
}


void myWidget::dropEvent(QDropEvent *event)
{
	QList< QUrl> urs;
	urs = event->mimeData()->urls();
	for (int i = 0; i < urs.size(); i++)
	{
		QFileInfo fileInfo(urs[i].toLocalFile());
		if (formatList.contains(fileInfo.suffix()))
		{
			if ("qgs" == fileInfo.suffix()||"qgz"== fileInfo.suffix())
			{
				projectOpen(fileInfo.filePath());// 打开qgs与qgz文件
			}
			else
			{
				addLayer(fileInfo.filePath());// 打开矢量或栅格图层
			}
		}
	}
}

上面就是两个虚函数的定义了,下面是变量formatList的定义。

formatList << "tif" << "tiff" << "hdf" << "shp" << "qgs" << "qgz" << "jpg" << "png" << "bmp";

总结:这样就完成了上面9种文件的拖放打开方式,其实这是用Qt功能范畴完成的,所以当然支持Qt其他控件打开文件,代码也基本是一样的,只不过把文件格式与打开文件的函数换成自己对应的就行了。上面两个打开文件的函数projectOpen 与addLayer是自己写的,源码中很容易找到,如果不想自己写,可以参考我前面的博客,也可以留言发过去。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值