Получение информации о форме из QWebView - PullRequest
1 голос
/ 01 сентября 2011

В настоящее время я пытаюсь получить некоторую информацию от QWebView, но, к сожалению, не могу.

Как узнать, какие поля изменил пользователь в форме?Может быть несколько, включая скрытые, которые мне не интересны, я хочу только информацию о том, какие из них были изменены пользователем.(Один из способов для этого - перечислить все формы и входные данные с помощью методаубъектов Java () и проверить их позже, но это ужасно и не поможет со второй проблемой)

Также я хочу узнать информацию оФорма сама.Какое было имя, метод и действие?

В настоящее время QWebPage предоставляет только переопределение acceptNavigationRequest () с типом NavigationTypeFormSubmitted, которое мне не помогает, поскольку не предоставляет мне никакой этой информации.1008 * Спасибо за помощь!

1 Ответ

2 голосов
/ 02 сентября 2011

Хорошо, прочитав некоторые «Связанные» вопросы здесь, я в конце концов обнаружил, что единственным способом может быть JavaScript.

Мое решение приведено ниже.После изменения данных на веб-сайте m_changedInputs содержит информацию о том, какие формы и какие входные данные были изменены.

CustomWebPage::CustomWebPage(QWidget *parent)
: QWebPage(parent)
{
    connect(this, SIGNAL(loadFinished(bool)), this, SLOT(onLoadFinished(bool)));
}

...

void CustomWebPage::onLoadFinished(bool ok)
{
    // Do nothing on fail
    if ( !ok )
        return;

    // Clear all cached data
    m_changedInputs.clear();

    // Get the main frame
    QWebFrame* frame = mainFrame();
    frame->addToJavaScriptWindowObject("pluginCreator", this);

    // Find the form
    QWebElementCollection forms = frame->findAllElements("form");

    // Iterate the forms
    foreach(QWebElement form, forms) {
        // Determine the name of the form
        QString formName = form.attribute("name");

        // Find the forms' input elements
        QWebElementCollection inputs = form.findAll("input");

        // Iterate the inputs
        foreach(QWebElement input, inputs) {
            input.setAttribute("onchange", QString("pluginCreator.onInputChanged(\"%1\", this.name);").arg(formName));
        }
    }
}

void CustomWebPage::onInputChanged(const QString& formName, const QString& inputName)
{
    qDebug() << "Form (" << formName << ") data changed:" << inputName;

    // Make sure we only have each input once. A QSet would also do the trick.
    QStringList& inputNames = m_changedInputs[formName];
    if ( !inputNames.contains(inputName) )
        inputNames.append(inputName);
}
...