Добрый день форумчане есть проблема в реализации драг дропа папок (драг дроп осуществляется treeview И treeview_2
в которых представлена файловая система)
Собственно treeview
model1->setRootPath(QDir::currentPath());
model1->setFilter(QDir::AllDirs | QDir::Files |QDir::NoDot);
model1->setReadOnly(false); /
ui->treeview->setModel(model1);
Собственно treeview_2
model2->setRootPath(QDir::currentPath());
model2->setFilter(QDir::AllDirs | QDir::Files |QDir::NoDot);
model2->setReadOnly(false);
ui->treeview_2->setModel(model2);
Разрешаю виджетам принимать дропы
ui->treeView->setAcceptDrops(true);
ui->treeView_2->setAcceptDrops(true);
В общем treeview и treeView_2 наследуются от mytreeview
Здесь все норм у меня
Далее идет класс mytreeview
#include <mainwindow.h>
#include "mytreeview.h"
#include <QApplication>
extern int flag;
mytreeview::mytreeview(QWidget *parent)
:QTreeView(parent)
{
}
void mytreeview::mousePressEvent(QMouseEvent *event) //событие при нажатии мышки
{
if (event->button() == Qt::RightButton) //в случае нажатия правой кнопки мыши
{
emit sg(); //испускаем сигнал который активирует контекнсное меню
}
if (event->button()==Qt::LeftButton) //если зажата левая кнопка мыши
{
m_ptDragPos=event->pos(); //определяем позицию указателя (первоначальная позиция указателя)
emit activation(); //испускаем сигнал который активирует метод определения активации окна
}
QTreeView::mousePressEvent(event); //передаем событию qtreeview
}
void mytreeview::keyPressEvent(QKeyEvent *event) // событие при нажатии клавиши
{
if (event->key()==Qt::Key_Control) //если нажата кнопка контрол
{
emit sg2(1,1); //посылаем сигнал на мультиселекцию
}
if (event->key()==Qt::Key_C && event->modifiers()==Qt::ControlModifier) //при нажатии клавиш ctrl+c
{
emit ctrl_c(); //вызываем сигнал который активирует копирование
}
if (event->key()==Qt::Key_Delete) //в случае нажатия клавиши делет
{
emit key_delete(); //запускаем удаления объекта
}
if (event->key()==Qt::Key_V && event->modifiers()==Qt::ControlModifier) //в случае нажатия сочетания клавиш кнтрл+в
{
emit ctrl_v(); //запускаем вставку
}
if (event->key()==Qt::Key_X && event->modifiers()==Qt::ControlModifier) // в лучае нажатия клавиш кнтрл+х
{
emit ctrl_x(); //активирует сигнал который включает вырезание файла
}
if (event->key()==Qt::Key_F2) //в случае нажатия клавиши F2
{
emit F2();
}
QTreeView::keyPressEvent(event);
}
void mytreeview::keyReleaseEvent(QKeyEvent *event) // событие при отпускании клавиши
{
if (event->key()==Qt::Key_Control)
{
emit sg2(2,0); //посылаем сигнал на одиночную селекцию
}
if (event->key()==Qt::Key_C && event->modifiers()==Qt::ControlModifier)
{
emit sg2(2,0); //посылаем сигнал на одиночную селекцию
}
if (event->key()==Qt::Key_V && event->modifiers()==Qt::ControlModifier)
{
emit sg2(2,0); //посылаем сигнал на одиночную селекцию
}
else
{
QTreeView::keyReleaseEvent(event);
}
}
void mytreeview::startDrag() //старт метода переноса данных
{
pMimeData=new QMimeData; //создаем новый объект класса QMimeData
pMimeData->setText("text/uri-list"); //вводим текст
pDrag=new QDrag(this); // создаем новый объект класса QDrag
pDrag->setMimeData(pMimeData);
pDrag->exec(Qt::CopyAction);
}
void mytreeview::mouseMoveEvent(QMouseEvent *event) //событие при зажатой ЛКМ при перетаскивании в сторону
{
if (event->buttons() && Qt::LeftButton) //если зажата левая кнопка мыши
{
int distance=(event->pos()-m_ptDragPos).manhattanLength(); //вычисляем расстояние текущей позиции указателя-первоначальной позиции указателя в которой была нажата ЛКМ
if (distance> QApplication::startDragDistance()) //если расстояние больше чем возвращаемое расстояние статистического метода
//startdragdistance(которое равно по умолчанию 4 пикселя) значит активируется операция перетаскивания
//если меньше пользователя случайно двинул указаетль мыши
{
startDrag();
}
}
QTreeView::mouseMoveEvent(event);
}
void mytreeview::dragEnterEvent(QDragEnterEvent *event) //метод вызывается каждый раз когда объект пересекает границу виджета
{
if (event->mimeData()->hasFormat("text/plain")) // если перетаскиваемы объект файл
{
event->acceptProposedAction(); // сообщение виджета о готовности принять объект
}
QTreeView::dragEnterEvent(event);
}
void mytreeview::dropEvent(QDropEvent *event)
{
QList<QUrl> urlList=event->mimeData()->urls();
QString str;
foreach (QUrl url,urlList)
{
str=str+url.toString()+"\n";
MainWindow fv;
fv.otobr(str);
}
QTreeView::dropEvent(event);
}
Программа работает,но она как бы переносит только один файл или несколько.
Работает она так:
1)Вы зажали ЛКМ
2)затем начинаете отводить (когда вы отводите драг дроп по прежнему недоступен)
3) Драг дроп активируется только тогда когда вы ОТПУСКАЕТЕ ЛКМ( появляется значок+ в Linux)
А должно быть так соответственно чтобы когда я отвел выделенный элемент на достаточное расстояние активировалось перетаскивание( БЕЗ ОТПУСКАНИЯ ЛКМ)
А у меня почему то активируется только при отпускании ЛКМ.
Соответственно у меня вопросы:
1)Как решить вопрос чтоб драг дроп активировался без отпускания ЛКМ
2) Что нужно сделать (или что переопределить) чтобы программа драг дропала папку или несколько папок?