Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
1

Обмен элементами Drag and Drop

02.02.2013, 18:13. Показов 3149. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
EHLO ув. All!
Есть два виджета: QListWidget и QTableWidget. Нужно сделать возможность перетащить итем с листа в таблицу, при этом, если в таблице была пустая ячейка, её нужно затереть и вставить туда имет из листа, из лист виджета этот итем соответственно жахнуть, если же в таблице уже был итем, то их нужно поменять местами. Если итем переносится с ячейки таблицы, в другую ячейку теблицы, они меняются местами, если же переносится в лист виджет, то в листе он добавляется, а из таблицы удаляется.
В общем надеюсь понятно разъяснил...
Собственно до чего дошел: если поставить DrugAndDromMode по умолчанию, то из одного виджета в другой таскается без проблем, но затирает виджет, в который бросают. Если же выставить InternalMode то внутри виджета все работает корректно, итемы меняются, но в другой виджет их перекинуть не получается
В общем хелп мин, сос ми заранее благодарствую...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2013, 18:13
Ответы с готовыми решениями:

Drag and Drop
Нужна помощь в реализации D&D в своей программе. Вообщем, у меня имеется классы наследующие...

Drag n Drop
В общем пытаюсь сделать drag n drop . имеется textEdit , туда перетаскиваю текстовый файл. В...

Drag and drop
Доброго времени суток! Задача такая, с помощью Drag and drop перенести какой-либо виджет(это может...

Drag & Drop
Доброго! Подскажите пожалуйста, перекрыл dropEvent (QDropEvent * event) в QTableWidget-e, тяну с...

9
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
03.02.2013, 11:24 2
l_a_m, почему бы не отнаследоваться и переопределить drag/drop события?
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
04.02.2013, 11:01  [ТС] 3
для обоих классов?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.02.2013, 22:50 4
Цитата Сообщение от l_a_m Посмотреть сообщение
для обоих классов?
Ну видимо придется для обоих. Во всяком случае, так сразу другого решения я не вижу
А для реализации swap'a уже поиграться с QDropEvent::source.
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
05.02.2013, 10:46  [ТС] 5
как по мне, то задача очень тривиальная... ну не верю я, что придется велосипед изобретать
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
05.02.2013, 17:21 6
l_a_m, не думаю, что swap с помощью drag'n'drop является типичной задачей. Обычно все же данные либо копируют, либо переносят. Я конечно же могу ошибаться.
1
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
05.02.2013, 18:10  [ТС] 7
эх... уже все сделал, остался только тяни и швыряй
ну что ж... придется ручками велосипеды делать
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
06.02.2013, 10:45 8
l_a_m, можешь показать решение?
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
06.02.2013, 10:56  [ТС] 9
ок, как навояю кину
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
20.02.2013, 15:40  [ТС] 10
собственно как и обещал:

Если эл-ты внутри одного и того же виджета, они меняются местами, если бросили с другого виджета, то устанавливаю значение и бросаю сингал, с предыдущим значением переменной. А дальше уже проблемы другого виджета, чего с этим значением делать :-)

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#ifndef TABLO_EDITOR_TABLE_WIDGET_H
#define TABLO_EDITOR_TABLE_WIDGET_H
#include <QTableWidget>
//--------------------------------------------------------------------------------------------------
class TabloEditorTableWidget: public QTableWidget { Q_OBJECT
//--------------------------------------------------------------------------------------------------
public:         TabloEditorTableWidget(QWidget *parent) : QTableWidget(parent) {
 
                }
//--------------------------------------------------------------------------------------------------
public:     virtual ~TabloEditorTableWidget() { }
//--------------------------------------------------------------------------------------------------
protected:      void    dropEvent ( QDropEvent * event ) {
                    QByteArray encoded = event->mimeData()->data("application/x-qabstractitemmodeldatalist");
                    QDataStream stream(&encoded, QIODevice::ReadOnly);
 
                    const int x = event->pos().x();
                    const int y = event->pos().y();
                    QTableWidgetItem * item = itemAt(x,y) ;
                    if (NULL == item) {
                        event->ignore();
                        return;
                    }
 
                    while (!stream.atEnd())
                    {
                        int row, col;
                        QMap<int, QVariant> itemData;
                        QMap<int, QVariant> roleDataMap;
                        stream >> row >> col >> roleDataMap;
 
                         QMapIterator<int, QVariant> iterRoleData(roleDataMap);
                         while (iterRoleData.hasNext()) {
                             iterRoleData.next();
                             const int key = iterRoleData.key();
                             QVariant data = item->data(key);
                             if (false == data.isNull()) {
                                itemData.insert(key, data);
                             }
                         }
                        if (this == event->source()) {
                            QTableWidgetItem * dragItem = QTableWidget::item(row, col);
                            if (NULL == dragItem) {
                                event->ignore();
                                return;
                            }
                            QMapIterator<int, QVariant> iter(itemData);
                            while (iter.hasNext()) {
                                iter.next();
                                dragItem->setData(iter.key(), iter.value());
                            } 
                        } else {
                            emit dropped(row, col, itemData);
                        }
 
                        QMapIterator<int, QVariant> iter(roleDataMap);
                        while (iter.hasNext()) {
                            iter.next();
                            item->setData(iter.key(), iter.value());
                        }
                    }
 
                    event->acceptProposedAction();
                    event->accept();
                }
//--------------------------------------------------------------------------------------------------
signals:        void dropped(int row, int col, QMap<int,  QVariant> data);
};
//--------------------------------------------------------------------------------------------------
#endif//TABLO_EDITOR_TABLE_WIDGET_H
2
20.02.2013, 15:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2013, 15:40
Помогаю со студенческими работами здесь

Drag and Drop QWidget
Здравствуйте. Имею на своем MainWindow Qwidgets(QTabWidget,QTreeView,QListView,MyWidget),...

Drag and Drop в QGraphicsView
Переопределил я dragEnterEvent: void Map::dragEnterEvent(QDragEnterEvent *event){ ...

Drag and Drop в QGraphicsScene
Здравствуйте! Столкнулся с такой проблемой. Есть у меня сцена: class BattleScene : public...

Drag & drop
Я ничего не смыслю в qt. Кто может, помогите пожалуйста склеить программу из этого -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru