Название: QLabel и Drag-and-drop Отправлено: Alp от Август 20, 2009, 13:44 Есть самописный контрол, на котором лежат несколько QExtLabel (немного доработаные под мои нужды QLabel).
Что хочется: 1. Иметь возможность перетаскивать эти контролы между собой (например: перетащил foo на bar, они поменялись местами) 2. Иметь возможность скинуть на них что-нибудь извне (в случае винды - из explorer'а). Установка setAcceptDrops не помогает (при перетаскивании курсор сохраняет вид "недоступно для сброса", хотя в dragEnterEvent я попадаю) 3. Иметь возможность "вытащить" любой из них за пределы приложения (например: вытаскиваю лейбл с надписью "foobar" на рабочий стол, там создается папка) В перегруженные dragLeaveEvent/dropEvent я не попадаю, только в dragEnterEvent при перетаскивании снаружи. Использовать QTextEdit или QLineEdit не хочу, потому, что QLabel за меня отрисовывает всё, что надо (а надо - просто текст, рамку, отличную от дефолтного фрейма и устанавливаемый фон), умеет html плюс на неё можно положить отрендеренную фритайпом картинку. Название: Re: QLabel и Drag-and-drop Отправлено: spectre71 от Август 21, 2009, 03:27 QDropEvent::acceptProposedAction();
Название: Re: QLabel и Drag-and-drop Отправлено: Alp от Август 21, 2009, 12:40 QDropEvent::acceptProposedAction(); А можно поподробнее? Не очень понял как применять.Название: Re: QLabel и Drag-and-drop Отправлено: spectre71 от Август 21, 2009, 15:18 QDropEvent::acceptProposedAction(); А можно поподробнее? Не очень понял как применять.Код
Название: Re: QLabel и Drag-and-drop Отправлено: Alp от Август 21, 2009, 16:09 Спасибо за ответ, но про это я писал в первом посте. Перегружал я эти эвенты. Результат нулевой. Просто не попадаю туда.
Дело, вероятно, в том, что QLabel не умеет дропать что-либо из себя. Вопрос был в том, как это обойти, не имплементируя драг-дроп через mousePressEvent-mouseMoveEvent-mouseReleaseEvent. Название: Re: QLabel и Drag-and-drop Отправлено: Alp от Август 21, 2009, 17:02 Задача решена. Для драга самих лейблов необходимо перегрузить mousePressEvent-mouseMoveEvent, в которых решать начинается ли драг или нет и если начинается - проставляются нужные значения майм-типа и даных (в последние можно запихнуть, например, указатель на исходный лейбл и по mime-типу (ересь вроде 'mymimedata/qextlabel-ptr') определять, что это двоичные данные).
Для дропа - перегружаются dragLeaveEvent-dropEvent-dragEnterEvent, причем в последнем необходимо в зависимости от mime-типа драгаемого содержимого разрешить или не разрешить дроп на себя. В приложении пример. |