Название: кто-нибудь переписывал drag-and-drop для QWebview? Отправлено: Radmir от Сентябрь 27, 2016, 08:54 Добрый день всем!
Qt 4.8.6 под windows или linux. Не работает drag-and-drop с кнопкой ctrl внутри qwebview. По идее она должна создавать копию помеченного текста в новом месте. Однако так не получается. Также не кладется link на рабочий стол. Кто-нибудь переписывал эту вещь или добился успехов через eventFilter. Поделитесь, чем можете. Радмир Название: Re: кто-нибудь переписывал drag-and-drop для QWebview? Отправлено: Radmir от Сентябрь 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. Радмир Название: Re: кто-нибудь переписывал drag-and-drop для QWebview? Отправлено: Radmir от Октябрь 15, 2016, 08:12 Добился отсутсвия при перетаскивании, символ отсутствует, однако, если нажать на пробел перед первым символом вставки, окрашивание появляется снова.
Какие будут предположения? Радмир Название: Re: кто-нибудь переписывал drag-and-drop для QWebview? Отправлено: Radmir от Ноябрь 04, 2016, 09:21 Наконец, небольшое продвижение:
Оказалось, что под виндой drag-and-drop реализуется через OLE2. Вызывается функция DoDragDrop, она и решает, что делать DragCopy или DragMove. У меня цепляется в C:\Program Files\Microsoft SDKs\Windows\v7.0A. Должно быть эта реализация Ole2 такая, которая не поддерживает DragCopy. Кто-нибудь может подсказать, как прицепиться к той версии Ole2, которая работает? Радмир Название: Re: кто-нибудь переписывал drag-and-drop для QWebview? Отправлено: Radmir от Ноябрь 04, 2016, 09:24 Добился отсутсвия при перетаскивании, символ отсутствует, однако, если нажать на пробел перед первым символом вставки, окрашивание появляется снова. Какие будут предположения? Радмир Вот еще особенность: Если перетаскивать извне, то явление не наблюдается. Радмир Название: Re: кто-нибудь переписывал drag-and-drop для QWebview? Отправлено: Radmir от Ноябрь 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, но хотелось бы сделать правильно, если исходника не будет, придется самому переписать ее!? Радмир. Название: Re: кто-нибудь переписывал drag-and-drop для QWebview? Отправлено: Radmir от Ноябрь 13, 2016, 08:53 Добился отсутсвия при перетаскивании, символ отсутствует, однако, если нажать на пробел перед первым символом вставки, окрашивание появляется снова. Какие будут предположения? Радмир Вот еще особенность: Если перетаскивать извне, то явление не наблюдается. Радмир Окончательно установлено, точки вставки дроп акции перетаскивания критичны, можно сделать несколько операций, и вставка буквы в эту позицию ведет к окрашиванию вставленного текста. Если их две, то будет и две подсветки при печати в каждой точке вставки. Классная фича, даже не представляю как ее преодолеть! Переписать gui? С уважением, Радмир Название: Re: кто-нибудь переписывал drag-and-drop для QWebview? Отправлено: Radmir от Ноябрь 25, 2016, 18:35 Насчет феномена окрашивания выяснилось следующее. Drag-and-Drop ни причем. Что-то с реализацией QWebView под Windows в Qt 4.8.x. Самый простой пример следующий:
Набираем предложение в QWebView, двойным кликом выделяем слово, меняем шрифт, например делаем его Bold, Italic или UnderLine, ставим курсор в непосредственно за этим словом, печатаем любую букву, и синева окрашивает следующее слово. Похоже в позиции, в которых стоит закрывающий html тег, или начало, конец промежутка выделения, вводить что либо нельзя. Установить, кто в конечном счете красит, к сожалению, не удалось. Я могу изменить исходные файл Qt, но отладчик cdb не останавливается на установленных точках прерывания в этих файлах, поэтому приходится оперировать отладочной печатью. Тестовый проект не включает непосредственно эти файлы, если их включить, то он не находит файлы include, которые указаны по относительному пути к проектам Qt. Не могу разобраться куда поместить тестовый проект, чтобы точки прерывания работали... Надо бы как-то похимичить с точками ввода, например, сдвигать точку/позицию каретки, и делать ввод туда где нет подкрашивания, но пока не получается. Еще одни интересный момент, впечатать букву куда попало нельзя, это хорошо видно при перетаскивании, там курсор прыгает из позиции в позицию, там где можно будет вставить текст. Интересно, как это сделано? Радмир |