一、拖放操作相关事件
启动拖动操作需要创建一个QDrag对象描述拖动操作,以及创建一个QMimeData类的对象用于存储拖动操作的格式信息和数据,并将其赋值为QDrag对象的mimeData属性。当拖动操作移动到放置点时,首先触发dragEnterEvent()事件处理函数,此函数中一般要通过QDrag对象的mimeData数据判断拖动操作的来源和参数,以确定是否接受放置操作。在接受放置后,触发dropEvent()事件处理函数。
是否接受拖动操作(组件):
void setAcceptDrops(bool on);
QMimeData对象可能用多种格式存储同一数据。用于记录有关其MIME类型的信息的数据提供容器。使用函数:
QStringList QMimeData::formats() const;
返回对象支持的格式列表。formats()能够返回合适数据的 MIME 类型列表,列表中的格式按优先级排序。执行效果:
application/x-qt-windows-mime;value="Shell IDList Array"
application/x-qt-windows-mime;value="DragImageBits"
application/x-qt-windows-mime;value="DragContext"
application/x-qt-windows-mime;value="DragSourceHelperFlags"
application/x-qt-windows-mime;value="InShellDragLoop"
text/uri-list //是标准的MIME格式,表示URL或本机上的文件来源
application/x-qt-windows-mime;value="FileName"
application/x-qt-windows-mime;value="FileContents"
application/x-qt-windows-mime;value="FileNameW"
application/x-qt-windows-mime;value="FileGroupDescriptorW"
在得知MIME的数据格式是text/uri-list后,可使用QMimeData的函数urls()获取一个列表。
QList<QUrl> QMimeData::urls() const;//返回一个QUel的列表数据,函数QUrl::path()可返回URL的路径
二、实现
1、在widget.h中重新实现事件处理函数
protected:
void dragEnterEvent(QDragEnterEvent* event);//拖拽文件进入窗口时触发的事件处理函数
void resizeEvent(QResizeEvent* event);//窗口改变大小时触发的事件处理函数
void dropEvent(QDropEvent* event);//窗口文件在窗口上放置时触发的事件处理函数
2、widget构造函数
//设置背景色
ui->lab_3_4->setStyleSheet("background-color:rgb(204,255,255)");
ui->lab_4_3->setStyleSheet("background-color:rgb(204,255,255)");
ui->plainTextEdit->setStyleSheet(("background-color:rgb(192,192,192)"));
this->setStyleSheet("background-color:rgb(0,0,0)");
//设置文本
ui->lab_3_4->setText("3:4.png");
ui->lab_3_4->setAlignment(Qt::AlignCenter);
ui->lab_4_3->setText("4:3.png");
ui->lab_4_3->setAlignment(Qt::AlignCenter);
//设置图片适应组件大小
ui->lab_3_4->setScaledContents(true);
ui->lab_4_3->setScaledContents(true);
//组件是否接受放置操作?
this->setAcceptDrops(true);//窗口接受
ui->plainTextEdit->setAcceptDrops(false);
ui->lab_3_4->setAcceptDrops(false);//lab不接受,交给窗口处理
ui->lab_4_3->setAcceptDrops(false);//lab不接受,交给窗口处理
3、dragEnterEvent()实现
acceptProposedAction()函数表示接受拖动操作,允许后续的放置操作。
ignore()函数表示不接受拖动操作,不允许后续的放置操作。
QUrl::path()返回的路径,返回“/C:/Users/Leo/Desktop/飞机.jpg”,需要注意的是开头有一个额外的“/”。(URL统一资源定位符)
ui->plainTextEdit->clear();
qDebug()<<"放置事件触发";
//清空lab状态
ui->lab_3_4->clear();
ui->lab_4_3->clear();
for(int i=0;i<event->mimeData()->formats().size();i++)
ui->plainTextEdit->appendPlainText(event->mimeData()->formats().at(i));
//formats():
//返回对象支持的格式列表。这是一个MIME类型列表,对象可以为其返回合适的数据。列表中的格式按优先级顺序排列。
//对于最常见的数据类型,您可以调用更高级的函数hasText()、hashhtml()、hasUrls()、hasImage()和hasColor()。
for(int i=0;i<event->mimeData()->urls().size();i++)
{
QUrl url=event->mimeData()->urls().at(i);//带路径的文件名
ui->plainTextEdit->appendPlainText(url.path());
}
if(event->mimeData()->hasUrls())//Returns true if the object can return a list of urls; otherwise returns false.
{
QString filename=event->mimeData()->urls().at(0).fileName();//获取文件名
QFileInfo fileinfo(filename);//湖片区文件信息
QString ext=fileinfo.suffix().toUpper();//获取文件后缀
if(ext=="JPG"||ext=="PNG")
{
event->acceptProposedAction();//接受拖拽操作
qDebug()<<"acceptProposedAction 接受拖拽事件";
}
else
{
event->ignore();//忽略事件
qDebug()<<"ignore 忽略拖拽事件";
}
}
4、dropEvent()实现
QString filename=event->mimeData()->urls().at(0).path();//获取完整文件名
filename=filename.right(filename.length()-1);//去掉最左边的 '/'
QPixmap pixmap(filename);
int width=pixmap.width();
int hight=pixmap.height();
int ratio=width/hight;
qDebug()<<ratio;
if(ratio==0)
ui->lab_4_3->setPixmap(pixmap);
else if(ratio==1)
ui->lab_3_4->setPixmap(pixmap);
event->accept();
5、resizeEvent()实现
QSize sz=ui->plainTextEdit->size();
QSize szwidget=this->size();
qDebug()<<"szwidget="<<szwidget.width();
ui->plainTextEdit->resize(szwidget.width()-23,sz.height());
event->accept();