在日常使用qt的时候,因为是windows桌面应用,所以会产生许多交互。拖动就是就是一个比较常见的交互。
比如我要拖动一份文件到qtextedit。但是发现拖进去之后,只显示一个路径。
而我需要实现效果如下:
1.当拖入图片的时候,显示图片
2.当我拖入文件的时候,读取文件(目前只实现读取txt文本)
3.从磁盘内复制的图片或文件,使用ctrl+v能将图片或文件添加到textedit
这个首先需要实现鼠标拖动事件。及dropEvent,我们需要重写这个方法
QDropEvent可以获取到我们拖入的文件路径。定义一个qfileinfo来进行判断文件类型。
当为图片文件则,进行插入图片,文件类型则导入文本
如下为实习代码:
if(e->mimeData()->hasUrls())
{
QList<QUrl> list = e->mimeData()->urls();
for(int i = 0; i < list.count(); i++)
{
QString strPath=list[i].toLocalFile();
QFileInfo info(strPath);
QStringList imageTypeList;
imageTypeList<<"png"<<"jpg"<<"gif"<<"jepg"<<"xpm";
if(imageTypeList.contains(info.suffix()))
{
this->textCursor().insertImage(list[i].toLocalFile());
}
if(info.suffix()=="txt")
{
QFile file(strPath);
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
continue;
}
while (!file.atEnd()) {
QString strLine=file.readLine();
this->append(strLine);
}
file.close();
}
}
}
else
{
e->ignore();
}
这个需要用到键盘事件。keypressevent。
判断当前键盘事件是否为组合键 ctrl+v
if(e->modifiers()==(Qt::ControlModifier)&&e->key()==Qt::Key_V)
然后就是获取剪贴板的内容。若剪贴板有内容,导入的方式和拖入是一样的。这里需要注意的是。当不为组合键的时候,一定要加一句
QTextEdit::keyPressEvent(e);
若不加这句话,其他的键盘操作都会失效。比如说退格不能删除文字
代码:
if(e->modifiers()==(Qt::ControlModifier)&&e->key()==Qt::Key_V)
{
QClipboard *clipboard = QApplication::clipboard();
const QMimeData *mimeData = clipboard->mimeData(); //死值
QList<QUrl> list = mimeData->urls();
for(int i = 0; i < list.count(); i++)
{
QString strPath=list[i].toLocalFile();
QFileInfo info(strPath);
QStringList imageTypeList;
imageTypeList<<"png"<<"jpg"<<"gif"<<"jepg"<<"xpm";
if(imageTypeList.contains(info.suffix()))
{
this->textCursor().insertImage(list[i].toLocalFile());
}
if(info.suffix()=="txt")
{
QFile file(strPath);
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
continue;
}
while (!file.atEnd()) {
QString strLine=file.readLine();
this->append(strLine);
}
file.close();
}
}
}
else
{
QTextEdit::keyPressEvent(e);
}
看下实现效果怎么样: