Russian Qt Forum
Октябрь 02, 2024, 19:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QLabel и Drag-and-drop  (Прочитано 5266 раз)
Alp
Гость
« : Август 20, 2009, 13:44 »

Есть самописный контрол, на котором лежат несколько QExtLabel (немного доработаные под мои нужды QLabel).
Что хочется:
1. Иметь возможность перетаскивать эти контролы между собой (например: перетащил foo на bar, они поменялись местами)
2. Иметь возможность скинуть на них что-нибудь извне (в случае винды - из explorer'а). Установка setAcceptDrops не помогает (при перетаскивании курсор сохраняет вид "недоступно для сброса", хотя в dragEnterEvent я попадаю)
3. Иметь возможность "вытащить" любой из них за пределы приложения (например: вытаскиваю лейбл с надписью "foobar" на рабочий стол, там создается папка)

В перегруженные dragLeaveEvent/dropEvent я не попадаю, только в dragEnterEvent при перетаскивании снаружи.

Использовать QTextEdit или QLineEdit не хочу, потому, что QLabel за меня отрисовывает всё, что надо (а надо - просто текст, рамку, отличную от дефолтного фрейма и устанавливаемый фон), умеет html плюс на неё можно положить отрендеренную фритайпом картинку.
Записан
spectre71
Гость
« Ответ #1 : Август 21, 2009, 03:27 »

QDropEvent::acceptProposedAction();
Записан
Alp
Гость
« Ответ #2 : Август 21, 2009, 12:40 »

QDropEvent::acceptProposedAction();
А можно поподробнее? Не очень понял как применять.
Записан
spectre71
Гость
« Ответ #3 : Август 21, 2009, 15:18 »

QDropEvent::acceptProposedAction();
А можно поподробнее? Не очень понял как применять.
Не плохо бы почитать доку!

Код
C++ (Qt)
void MyWidget::dropEvent (QDropEvent* event) {
...
...
if(/*Ne hochu delat' drop*/) {return;}
event->acceptProposedAction();
// Obrabatyvaem Drop
}
 
void MyWidget::dragMoveEvent ( QDragMoveEvent * event ) {
...
...
if(/*Ne hochu delat' drop*/) {return;}
event->acceptProposedAction();
}
Записан
Alp
Гость
« Ответ #4 : Август 21, 2009, 16:09 »

Спасибо за ответ, но про это я писал в первом посте. Перегружал я эти эвенты. Результат нулевой. Просто не попадаю туда.

Дело, вероятно, в том, что QLabel не умеет дропать что-либо из себя. Вопрос был в том, как это обойти, не имплементируя драг-дроп через mousePressEvent-mouseMoveEvent-mouseReleaseEvent.
Записан
Alp
Гость
« Ответ #5 : Август 21, 2009, 17:02 »

Задача решена. Для драга самих лейблов необходимо перегрузить mousePressEvent-mouseMoveEvent, в которых решать начинается ли драг или нет и если начинается - проставляются нужные значения майм-типа и даных (в последние можно запихнуть, например, указатель на исходный лейбл и по mime-типу (ересь вроде 'mymimedata/qextlabel-ptr') определять, что это двоичные данные).
Для дропа - перегружаются dragLeaveEvent-dropEvent-dragEnterEvent, причем в последнем необходимо в зависимости от mime-типа драгаемого содержимого разрешить или не разрешить дроп на себя.
В приложении пример.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 21.