Поиск:

Ответ в темуСоздание новой темы Создание опроса
> drag drop, драг дроп папок и фалов 
:(
    Опции темы
koldun90
Дата 21.6.2014, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Всем привет. Подскажите что нужно сделать чтобы реализовать drag drop нескольких папок и файлов.
Допустим есть файл менеджер представленный в 2-ух qtreeview.  И нужно реализовать drag drop между двумя treeviewами.
Какие методы стоит переопределять. Потому что в  стандартном drag drope только можно переместить один файл из одного окна в другое.
А мне нужно реализовать копирование нескольких файлов, папки и нескольких папок.
PM MAIL   Вверх
Avazart
Дата 21.6.2014, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Почитай в книге Шлее, а так вопрос слишком не конкретный.

Это сообщение отредактировал(а) Avazart - 21.6.2014, 18:34
PM MAIL   Вверх
koldun90
Дата 21.6.2014, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Цитата(Avazart @ 21.6.2014,  18:33)
Почитай в книге Шлее, а так вопрос слишком не конкретный.

Я имею ввиду какие методы(может события) стоит переопределять qtreeview чтобы соответственно реализовать драг дроп папки или нескольких папок.
У меня вообще файловый менеджер как бы отображает данные в listview treeview tableview. Это режимы просмотра listview-значки treeview-дерево  tableview-таблица. 

и книга эта да?
http://rutracker.org/forum/viewtopic.php?t=4582272

Это сообщение отредактировал(а) koldun90 - 21.6.2014, 18:43
PM MAIL   Вверх
Avazart
Дата 21.6.2014, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Да, читайте, найдете ответы на свои вопросы.

Это сообщение отредактировал(а) Avazart - 21.6.2014, 21:14
PM MAIL   Вверх
koldun90
Дата 24.6.2014, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Avazart
Книгу я почитал начал реализовывать драг дроп 
Если можно приведу код

   //Собственно первая модель наследована от mytreeview
    
Код

   model1->setRootPath(QDir::currentPath());
    model1->setFilter(QDir::AllDirs | QDir::Files |QDir::NoDot);
    model1->setReadOnly(false);    /
    ui->treeview->setModel(model1);  


//Вторая модель тоже от mytreeview

Код

    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) Что нужно сделать (или что переопределить) чтобы программа драг дропала папку или несколько папок? (потому что в книге я не нашел этого)


Это сообщение отредактировал(а) koldun90 - 24.6.2014, 08:38
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1278 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.