Russian Qt Forum

Qt => Работа с сетью => Тема начата: pashazz от Июнь 20, 2009, 16:07



Название: QtWebKit где вызвано контекстное меню
Отправлено: pashazz от Июнь 20, 2009, 16:07
Я делаю браузер, и мне необходимо реализовать свое контекстное меню.
Но я так и не понял, как узнать, на ссылке ли вызвано контекстное меню, или просто на документе.

Я вызываю контекстное меню по сигналу QWebView::customContexMenuRequested()
Как это узнать?


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: denka от Июнь 20, 2009, 17:53
Попробуй ловить вот этот сигнал QWebPage::linkHovered ( const QString & link, const QString & title, const QString & textContent ) и так будешь знать когда курсор над ссылкой, а когда нет.


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: pashazz от Июнь 20, 2009, 19:07
и тогда сразу еще один вопрос - как отловить QWebAction, для, допустим, открытия ссылки в новом окне?


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: denka от Июнь 20, 2009, 19:57
Тут уже как сам захочешь: отловить сигнал от QAction, установить eventFilter, переопределить actionEvent ( QActionEvent * event )


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: pashazz от Июнь 20, 2009, 20:19
Попробуй ловить вот этот сигнал QWebPage::linkHovered ( const QString & link, const QString & title, const QString & textContent ) и так будешь знать когда курсор над ссылкой, а когда нет.
Сделал как ты сказал.
Ссылка при нажатии правой кнопкой выделяется ( в смысле текст ссылки), а нужно чтобы этого не было.
Как избежать выделения текста ссылки (ну кроме хаков типа принудительной очистки выделения)?


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: IMPOMEZIA от Июнь 21, 2009, 01:37
Использовать QWebHitTestResult, например так:
Код
C++ (Qt)
QWebHitTestResult r = page()->mainFrame()->hitTestContent(event->pos())
затем получить QUrl ссылки с помощью QUrl QWebHitTestResult::linkUrl () const
В итоге если QUrl получится не пустым значит под курсором ссылка иначе документ.


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: pashazz от Июнь 21, 2009, 10:38
Все это конечно хорошо, но текст ссылки выделяется, а нужно, чтобы этого не было


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: Pepelaz от Июль 08, 2009, 19:34
В общем я делал так. Где нибудь, в Mainwindow наример переопределяем метод eventfilter. У него 2 параметра:
1 - Кому прилетает событие
2 - Тип событие

Через него теперь все события летят - выбираем те, которые летят к нашему QWebView, сравнивая с параметром 1
Далее, сравнивая с параметром 2 выбираем событие QEvent::ContextMenu. Теперь в этом месте можно сделать что-то свое - например вызвать свое контекстное меню, но обязательно нужно вернуть true чтобы дефолтная обработка этого события не вызвалась. Выделения текста тоже кстати не будет тогда по правой кнопке мыши


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: nata267 от Октябрь 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);
    }
}


Название: Re: QtWebKit где вызвано контекстное меню
Отправлено: nata267 от Октябрь 14, 2011, 10:47
Не пойму только как узнать установлен ли фокус на элементе для ввода или нет?? Никто не знает как это узнать?? Это нужно для проверки в этом месте:

Код:
if(!QApplication::clipboard()->text().isEmpty() && ФОКУС_НА_ЭЛЕМЕНТЕ_ВВОДА)
            paste_action->setEnabled(true);
        else
            paste_action->setEnabled(false);