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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtWebKit где вызвано контекстное меню  (Прочитано 6755 раз)
pashazz
Гость
« : Июнь 20, 2009, 16:07 »

Я делаю браузер, и мне необходимо реализовать свое контекстное меню.
Но я так и не понял, как узнать, на ссылке ли вызвано контекстное меню, или просто на документе.

Я вызываю контекстное меню по сигналу QWebView::customContexMenuRequested()
Как это узнать?
Записан
denka
Гость
« Ответ #1 : Июнь 20, 2009, 17:53 »

Попробуй ловить вот этот сигнал QWebPage::linkHovered ( const QString & link, const QString & title, const QString & textContent ) и так будешь знать когда курсор над ссылкой, а когда нет.
Записан
pashazz
Гость
« Ответ #2 : Июнь 20, 2009, 19:07 »

и тогда сразу еще один вопрос - как отловить QWebAction, для, допустим, открытия ссылки в новом окне?
Записан
denka
Гость
« Ответ #3 : Июнь 20, 2009, 19:57 »

Тут уже как сам захочешь: отловить сигнал от QAction, установить eventFilter, переопределить actionEvent ( QActionEvent * event )
Записан
pashazz
Гость
« Ответ #4 : Июнь 20, 2009, 20:19 »

Попробуй ловить вот этот сигнал QWebPage::linkHovered ( const QString & link, const QString & title, const QString & textContent ) и так будешь знать когда курсор над ссылкой, а когда нет.
Сделал как ты сказал.
Ссылка при нажатии правой кнопкой выделяется ( в смысле текст ссылки), а нужно чтобы этого не было.
Как избежать выделения текста ссылки (ну кроме хаков типа принудительной очистки выделения)?
Записан
IMPOMEZIA
Гость
« Ответ #5 : Июнь 21, 2009, 01:37 »

Использовать QWebHitTestResult, например так:
Код
C++ (Qt)
QWebHitTestResult r = page()->mainFrame()->hitTestContent(event->pos())
затем получить QUrl ссылки с помощью QUrl QWebHitTestResult::linkUrl () const
В итоге если QUrl получится не пустым значит под курсором ссылка иначе документ.
Записан
pashazz
Гость
« Ответ #6 : Июнь 21, 2009, 10:38 »

Все это конечно хорошо, но текст ссылки выделяется, а нужно, чтобы этого не было
Записан
Pepelaz
Гость
« Ответ #7 : Июль 08, 2009, 19:34 »

В общем я делал так. Где нибудь, в Mainwindow наример переопределяем метод eventfilter. У него 2 параметра:
1 - Кому прилетает событие
2 - Тип событие

Через него теперь все события летят - выбираем те, которые летят к нашему QWebView, сравнивая с параметром 1
Далее, сравнивая с параметром 2 выбираем событие QEvent::ContextMenu. Теперь в этом месте можно сделать что-то свое - например вызвать свое контекстное меню, но обязательно нужно вернуть true чтобы дефолтная обработка этого события не вызвалась. Выделения текста тоже кстати не будет тогда по правой кнопке мыши
Записан
nata267
Гость
« Ответ #8 : Октябрь 13, 2011, 14:50 »

вот мое решение:

Код:
m_view = new QWebView(this);
m_view->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(m_view, SIGNAL(customContextMenuRequested(QPoint)),
            this, SLOT(showWebViewContextMenu(QPoint)));


вот слот, с которым связываю сигнал customContextMenuRequested(QPoint):

Код:
void Webbrowser::showWebViewContextMenu(const QPoint &point)
{
    QWebHitTestResult r = m_view->page()->mainFrame()->hitTestContent(point);
    if(r.isContentEditable()) {

        QMenu menu(QLatin1String(""), m_view);
        QAction *cut_action = menu.addAction(tr("Вырезать"));
        QAction *copy_action = menu.addAction(tr("Копировать"));
        QAction *paste_action = menu.addAction(tr("Вставить"));
        QAction *del_action = menu.addAction(tr("Удалить"));
        menu.addSeparator();
        QAction *selectAll_action = menu.addAction(tr("Выделить все"));

        if(!m_view->selectedText().isEmpty())
        {
            cut_action->setEnabled(true);
            copy_action->setEnabled(true);
            del_action->setEnabled(true);
        }
        else
        {
            cut_action->setEnabled(false);
            copy_action->setEnabled(false);
            del_action->setEnabled(false);
        }

         if(!QApplication::clipboard()->text().isEmpty())
            paste_action->setEnabled(true);
        else
            paste_action->setEnabled(false);

        QAction *picked_action = menu.exec(m_view->mapToGlobal(point));
        if(!picked_action)
           return;

        if(picked_action == cut_action)
           m_view->triggerPageAction(QWebPage::Cut);

        if(picked_action == copy_action)
           m_view->triggerPageAction(QWebPage::Copy);

        if(picked_action == paste_action)
           m_view->triggerPageAction(QWebPage::Paste);

        if(picked_action == del_action)
           m_view->triggerPageAction(QWebPage::DeleteEndOfWord);

        if(picked_action == selectAll_action)
           m_view->triggerPageAction(QWebPage::SelectAll);
    }
    else if(r.isContentSelected() && !m_view->selectedText().isEmpty()) {

        QMenu menu(QLatin1String(""), m_view);
        QAction *copy_action = menu.addAction(tr("Копировать"));
        QAction *selectAll_action = menu.addAction(tr("Выделить все"));

        QAction *picked_action = menu.exec(m_view->mapToGlobal(point));
        if(!picked_action)
           return;

        if(picked_action == copy_action)
           m_view->triggerPageAction(QWebPage::Copy);

        if(picked_action == selectAll_action)
           m_view->triggerPageAction(QWebPage::SelectAll);
    }
}
« Последнее редактирование: Октябрь 13, 2011, 15:06 от nata267 » Записан
nata267
Гость
« Ответ #9 : Октябрь 14, 2011, 10:47 »

Не пойму только как узнать установлен ли фокус на элементе для ввода или нет?? Никто не знает как это узнать?? Это нужно для проверки в этом месте:

Код:
if(!QApplication::clipboard()->text().isEmpty() && ФОКУС_НА_ЭЛЕМЕНТЕ_ВВОДА)
            paste_action->setEnabled(true);
        else
            paste_action->setEnabled(false);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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