为了将自己写的程序平时更好用更人性化,其中拖放打开文件是软件一个不可少的功能,有了这个功能免去了打开按钮再找文件对应路径的麻烦,虽然本文中介绍的是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是自己写的,源码中很容易找到,如果不想自己写,可以参考我前面的博客,也可以留言发过去。