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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QWebView запрет выделения текста, элементов страницы  (Прочитано 7747 раз)
Harmonic
Гость
« : Май 22, 2009, 05:05 »

Добрый день.

Возникла необходимость убрать возможность копирования-выделения текста со страницы,
отображаемой на WebView.
Контекстное меню убрал с помощью выставления свойства contextMenuPolicy = CustomContextMenu.
Осталось убрать возможность выделения.
Выставил свойства страницы ContentEditable в False + выставил у всех действий по выделения страницы Enabled в False - не работает.

Кто сталкивался и решил эту проблему расскажите пожалуйста.



Записан
kirill
Гость
« Ответ #1 : Май 22, 2009, 05:23 »

Если страница твоя, то отлично работает такое

Код:
<BODY style=\"-moz-user-select: none; -khtml-user-select: none; user-select: none;\">

Если страница из инета, то можешь перед выводом в WebView вставлять эту строчку Улыбающийся
Записан
Harmonic
Гость
« Ответ #2 : Май 22, 2009, 05:54 »

а без правки исходного кода страницы можно обойтись?
как-нибудь через свойства QWebPage например?
Записан
mugabe
Гость
« Ответ #3 : Май 25, 2009, 04:30 »

можно попробовать через QWebFrame::evaluateJavaScript
Записан
Harmonic
Гость
« Ответ #4 : Май 25, 2009, 06:36 »

на простых страницах действительно работает через javascript, делаю следующим образом
1) соединяю сигнал страницы loadFinished и свой слот
2) в функции-слоте у главного фрейма страницы в webView делаю
evaluateJavaScript(tr("document.onselectstart=function() {return false}"))

Но на более сложных состоящих из нескольких фреймов не получается запретить выделение
Пробовал еще ходить в цикле по списку mainFrame()->childFrames и во всех делать evaluateJavaScript.
Результат неудовлетворительный. Подскажите, что не так делаю.


Записан
Harmonic
Гость
« Ответ #5 : Май 27, 2009, 06:29 »

реализовал через фильтр событий webView
всем, кто откликнулся, спасибо
Записан
kirill
Гость
« Ответ #6 : Май 27, 2009, 09:36 »

реализовал через фильтр событий webView
всем, кто откликнулся, спасибо
Кинь код, пожалуйста
Записан
Pepelaz
Гость
« Ответ #7 : Май 29, 2009, 08:29 »

В общем у нас с Гармоником QT 4.5 и сделали мы довольно сомнительным способом через eventFilter. Вроде в документации по будующей QT 4.6 больше возможностей, но она бета и не хотелось бы сейчас ее использовать
А код такой, переделан пример Previewer


Код
C++ (Qt)
class MainWindow : public QMainWindow
{
....
private:
 
   bool sb_flag;
....
}
 
MainWindow::MainWindow()
{
   centralWidget = new Previewer(this);
   setCentralWidget(centralWidget);
      ...
   centralWidget->webView->installEventFilter(this);
   sb_flag = false;
   ....
}
 
bool MainWindow::eventFilter ( QObject * watched, QEvent * e)
{
   if (watched == centralWidget->webView)
   {
       if (e->type() == QEvent::MouseMove)
       {
           QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(e);
            if ( mouseEvent->buttons() & Qt::LeftButton & sb_flag)
           {
               return true;
           }
           sb_flag = false;
       }
       else if ( e->type() == QEvent::MouseButtonPress)
       {
           sb_flag = false;
 
           QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(e);
           if ( mouseEvent->modifiers() & Qt::ShiftModifier)
           {
              return true;
           }
       }
       else if ( e->type() ==  724) // не спрашивайте меня что это за код события, я не знаю ) он прилетает когда водишь мышкой с нажатой левой кнопкой и мышка находится не на скролбаре
       {
           sb_flag = true;
       }
       else if ( e->type() == QEvent::MouseButtonDblClick)
       {
           return true;
       }
       else if ( e->type() == QEvent::ContextMenu )
       {
           return true;
       }
    }
 
   return QMainWindow::eventFilter(watched, e);
}
 
« Последнее редактирование: Май 29, 2009, 17:20 от pastor » Записан
Mish_ka
Гость
« Ответ #8 : Март 17, 2011, 17:29 »

Копирование запрещено =)

!НО можно тупо выделить текст и перетащить его например в блокнот... =)
Записан
fuCtor
Гость
« Ответ #9 : Март 19, 2011, 18:57 »

Код:
void QWebSettings::setUserStyleSheetUrl ( const QUrl & location )

Specifies the location of a user stylesheet to load with every web page.

The location must be either a path on the local filesystem, or a data URL with UTF-8 and Base64 encoded data, such as:

"data:text/css;charset=utf-8;base64,cCB7IGJhY2tncm91bmQtY29sb3I6IHJlZCB9Ow=="

Note: If the base64 data is not valid, the style will not be applied.

Собственно в ресурсы ложим файлик, в который помещаем:

Код:
* {
-moz-user-select: none; -khtml-user-select: none; user-select: none;
}
И выделение работать не будет. Плюс чтобы не появлялся указатель текста добавляем:
Код:
body {cursor: default;}
a {cursor: pointer;}

И будет применяться ко всем страницам и фреймам в данном экземпляре.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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