crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проблема с Drag & Drop (QTreeWidget)
0xF
  опции профиля:
сообщение 17.7.2010, 14:44
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 71
Регистрация: 12.11.2007
Пользователь №: 20

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет!

Нужно сделать перетаскивание элементов дерева на другой виджет и оставить возможность таскать элементы в самом дереве.
Посмотрел доки - сделал. Теперь из дерева на виджет таскается, а внутри дерева - нет =( Вот код:
void QCustomTree::mouseMoveEvent( QMouseEvent *event )
{
    if( !(event->buttons() & Qt::LeftButton) ) {
        return;
    }

    if( !currentItem() ) {
        return;
    }

    QDrag        *drag     = new QDrag( this );
    QMimeData    *mimeData = new QMimeData;
    QByteArray    output;

    ----- Заполняю mimeData

    drag->setMimeData( mimeData );
    drag->start( Qt::CopyAction | Qt::MoveAction );
}


Попробовал переопределять dragEnterEvent дерва:
void QCustomTree::dragEnterEvent( QDragEnterEvent *event )
{
    mimeData        = new QMimeData;

    QDrag        *drag     = new QDrag( this );
    QByteArray    output;

    ----- Заполняю mimeData

    event->accept();
}

----- В виджете куда перетаскиваю элементы
void QTargetFrame::dropEvent( QDropEvent *event )
{
    QByteArray data;

    const QMimeData *mime = event->mimeData();

    if( event->source() == ( QWidget* )sourceTreeWidget ) {
        mime = sourceTreeWidget->mimeData;
    }

    ----- Работаю с mimeData
}

При таком способе работает перетаскивание внутри дерева, но когда я перетаскиваю элемент на другой виджет - вместо того, что бы скопироваться, он перетаскивается(удаляется из дерева) =(

Как сделать правильное перетаскивание? Желательно с возможностью перетаскивать несколько элементов дерева.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.7.2010, 16:58
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


А проект прицепи, если не сложно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
0xF
  опции профиля:
сообщение 17.7.2010, 17:18
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 71
Регистрация: 12.11.2007
Пользователь №: 20

Спасибо сказали: 0 раз(а)




Репутация:   0  


Проект не могу =(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.7.2010, 17:32
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


А что мешает ? Создай новый проектик, закинь туда минимум, показывающий проблемный код. А иначе как люди будут копаться - свой проект писать что ли ? ) Лично мне - лень (а с ходу решение не виду без копания).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
0xF
  опции профиля:
сообщение 17.7.2010, 21:25
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 71
Регистрация: 12.11.2007
Пользователь №: 20

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот минимальный пример:
---- Виджет откуда тащим
class QCustomTree : public QTreeWidget {
public:

    QMimeData        *mimeData;

public:

    QCustomTree( QWidget *parent ) : QTreeWidget( parent ) {}

    void    dropEvent( QDropEvent *event ) {
        QTreeWidget::dropEvent( event );
    }

    void    dragEnterEvent( QDragEnterEvent *event ) {
        --- Сохраняем информацию о типе, в примере он один, но в реальном приложении несколько разных, в зависимости от выбранного элемента
        mimeData = new QMimeData;
        mimeData->setData( "mime-data", NULL );
        event->accept();
    }
};

--- Виджет куда тащим
class QReceiver : public QTreeWidget {

    QCustomTree    *customTree;

public:

    QReceiver( QCustomTree *custom, QWidget *parent ) : QTreeWidget( parent ), customTree( custom ) {
        setAcceptDrops( true );
    }

    void dragEnterEvent( QDragEnterEvent *event ) {
        const QMimeData *mime = event->mimeData();

        ---- Если перетащили из QCustomTree - изменяем указатель на MIME данные
        if( event->source() == ( QWidget* )customTree ) {
            mime = customTree->mimeData;
        }

        if( mime->hasFormat( "mime-data" ) ) {
            event->acceptProposedAction();
        }
    }
};

---- Создаем два виджета
QCustomTree *tree = new QCustomTree( ui.frame_A );
QTreeWidgetItem *item = new QTreeWidgetItem( tree );
item->setText( 0, "item1" );
tree->insertTopLevelItem( tree->topLevelItemCount(), item );

item = new QTreeWidgetItem( tree );
item->setText( 0, "item2" );
tree->insertTopLevelItem( tree->topLevelItemCount(), item );

item = new QTreeWidgetItem( tree );
item->setText( 0, "item3" );
tree->insertTopLevelItem( tree->topLevelItemCount(), item );

tree->setDragEnabled( true );
tree->setAcceptDrops( true );
tree->setSelectionMode( QAbstractItemView::ExtendedSelection );
tree->setDragDropMode( QAbstractItemView::InternalMove );

// **
QReceiver *receiver = new QReceiver( tree, ui.frame_B );


В результате получаем два дерева, в одном можно тягать элементы и кидать во второе дерево. Только вот при перекидывании во второе дерево, элементы убиваются в первом, а они должны оставаться...

Прикрепел проект к посту.
Прикрепленные файлы
Прикрепленный файл  TreeWidget.zip ( 6.91 килобайт ) Кол-во скачиваний: 156
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.6.2024, 4:50