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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: кто-нибудь переписывал drag-and-drop для QWebview?  (Прочитано 3993 раз)
Radmir
Гость
« : Сентябрь 27, 2016, 08:54 »

Добрый день всем!

Qt 4.8.6 под windows или linux. Не работает drag-and-drop с кнопкой ctrl внутри qwebview. По идее она должна создавать копию помеченного текста в новом месте. Однако так не получается.
Также не кладется link на рабочий стол.

Кто-нибудь переписывал эту вещь или добился успехов через eventFilter.
Поделитесь, чем можете.

Радмир
Записан
Radmir
Гость
« Ответ #1 : Сентябрь 29, 2016, 19:22 »

Возьмем простой пример:
Делаем стандартное Qt приложение в Qt Creator-е с формой MainWindow.
Открываем его в дизайнере, добавляем элемент QWebView
В конструкторе добавляем:
 ui->webView->page()->setContentEditable(true);
запускаем, пишем любое приложение и выполняем перетаскивание.

Вопрос 1: почему не выполняется копирование при нажатом Ctrl?
Вопрос 2: почему после перетаскивания непосредственно перед перемещенным текстом стоит   ?
Вопрос 3: Если вы кликнете перед этим текстом и введете пробел, то весь перемещенный текст окрасится в синий цвет выделения, но на само деле это не выделение.

Если у вас всего этого нет, то дайте мне ваш webkit, хотя бы для подтверждения лицензии GNU.
Помните - это касается win32 + Qt 4.8.2, 4.8.5, 4.8.6.

Радмир

Записан
Radmir
Гость
« Ответ #2 : Октябрь 15, 2016, 08:12 »

Добился отсутсвия   при перетаскивании, символ отсутствует, однако, если нажать на пробел перед первым символом вставки, окрашивание появляется снова.
Какие будут предположения?

Радмир
Записан
Radmir
Гость
« Ответ #3 : Ноябрь 04, 2016, 09:21 »

Наконец, небольшое продвижение:

Оказалось, что под виндой drag-and-drop реализуется через OLE2. Вызывается функция DoDragDrop, она и решает, что делать DragCopy или DragMove. У меня цепляется в C:\Program Files\Microsoft SDKs\Windows\v7.0A. Должно быть эта реализация Ole2 такая, которая не поддерживает DragCopy.

Кто-нибудь может подсказать, как прицепиться к той версии Ole2, которая работает?

Радмир
Записан
Radmir
Гость
« Ответ #4 : Ноябрь 04, 2016, 09:24 »

Добился отсутсвия   при перетаскивании, символ отсутствует, однако, если нажать на пробел перед первым символом вставки, окрашивание появляется снова.
Какие будут предположения?

Радмир


Вот еще особенность: Если перетаскивать извне, то явление не наблюдается.

Радмир
Записан
Radmir
Гость
« Ответ #5 : Ноябрь 13, 2016, 08:43 »

Наконец, небольшое продвижение:

Оказалось, что под виндой drag-and-drop реализуется через OLE2. Вызывается функция DoDragDrop, она и решает, что делать DragCopy или DragMove. У меня цепляется в C:\Program Files\Microsoft SDKs\Windows\v7.0A. Должно быть эта реализация Ole2 такая, которая не поддерживает DragCopy.

Кто-нибудь может подсказать, как прицепиться к той версии Ole2, которая работает?

Радмир
Добрый день всем,

Анализ показал, что под виндой работает модуль qdnd_win.cpp, лежащий в исходнике Qt, каталог src/gui/kernel/
Он и вызывает OLE2 функцию  HRESULT r = DoDragDrop(obj, src, allowedEffects, &resultEffect);
Здесь obj - указатель на перетаскиваемые данные, src указатель на DropSource итерфейс. Сам DropSource итерфейс реализован в ранее указаном файле, все вроде хорошо, только в одном месте (модуль qdrag.cpp) отдается предпочтение операции Qt::MoveAction, она проверяется на допустимость раньше, чем Qt::CopyAction, но решение принимается в функции QOleDropSource::GiveFeedback(DWORD dwEffect) - она вызвается с параметром dweffect = 2 (хотя allowedEffects допускает все значения), что подразумевает Qt::MoveAction; более того, далее в ней следует оператор, который присваивает это значение переменной currentaction  и выдает сигнал о смене дроп операции.
Что происходит внутри DoDragDrop непостижимо, так она принадлежит Windows (У меня это WindowsSDK, v.7.0a.
В то же время пример на drag-and-drop на VB6 работает нормально, то есть OLE2 в порядке.
Может кто имеет исходит для WINOLEAPI DoDragDrop?
Дайте поковыряться. Я сделал workaround, но хотелось бы сделать правильно, если исходника не будет, придется самому переписать ее!?

Радмир.
Записан
Radmir
Гость
« Ответ #6 : Ноябрь 13, 2016, 08:53 »

Добился отсутсвия   при перетаскивании, символ отсутствует, однако, если нажать на пробел перед первым символом вставки, окрашивание появляется снова.
Какие будут предположения?

Радмир


Вот еще особенность: Если перетаскивать извне, то явление не наблюдается.

Радмир

Окончательно установлено, точки вставки дроп акции перетаскивания критичны, можно сделать несколько операций, и вставка буквы в эту позицию ведет к окрашиванию вставленного текста. Если их две, то будет и две подсветки при печати в каждой точке вставки. Классная фича, даже не представляю как ее преодолеть! Переписать gui?

С уважением,
Радмир
Записан
Radmir
Гость
« Ответ #7 : Ноябрь 25, 2016, 18:35 »

Насчет феномена окрашивания выяснилось следующее. Drag-and-Drop ни причем. Что-то с реализацией QWebView под Windows в Qt 4.8.x.  Самый простой пример следующий:
Набираем предложение в QWebView, двойным кликом выделяем слово, меняем шрифт, например делаем его Bold, Italic или UnderLine, ставим курсор в непосредственно за этим словом, печатаем любую букву, и синева окрашивает следующее слово.
Похоже в позиции, в которых стоит закрывающий html тег, или начало, конец промежутка выделения, вводить что либо нельзя. Установить, кто в конечном счете красит, к сожалению, не удалось.
Я могу изменить исходные файл Qt, но отладчик cdb не останавливается на установленных точках прерывания в этих файлах, поэтому приходится оперировать отладочной печатью. Тестовый проект не включает непосредственно эти файлы, если их включить, то он не находит файлы include, которые указаны по относительному пути к проектам Qt. Не могу разобраться куда поместить тестовый проект, чтобы точки прерывания работали...
Надо бы как-то похимичить с точками ввода, например, сдвигать точку/позицию каретки, и делать ввод туда где нет подкрашивания, но пока не получается.
Еще одни интересный момент, впечатать букву куда попало нельзя, это хорошо видно при перетаскивании, там курсор прыгает из позиции в позицию, там где можно будет вставить текст. Интересно, как это сделано?

Радмир
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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