[webkit-qt] QtWebkit & Virtual Keyboard

Andrew Webster apwebster at gmail.com
Tue Apr 27 06:30:39 PDT 2010


I did something similar for text inputs.  I hacked a class called
QWebPageEx that extends QWebPage into webkit that is able to determine
if a text field is selected and get and set the text in it.  In my
user app, I extended QWebPageEx and then every time there is a
MouseButtonRelease I check if a text field is selected and then open a
soft keyboard.

It's not the cleanest method and it breaks every time there's a major
update to webkit, but it does work.  You may be able to do something
similar for list/combo boxes.

Here is the header:
#include "qwebpage.h"

namespace WebCore
{
   class Node;
   class HTMLInputElement;
}

class QWEBKIT_EXPORT QWebPageEx : public QWebPage
{
public:
    QWebPageEx(QObject *parent = 0);
    ~QWebPageEx();

    bool isTextField() const;
    bool isPasswordField() const;

    QString text() const;
    void setText(const QString& text);
    QString getAttribute(const QString& attrName);

private:
    WebCore::Node* selectedNode() const;
    WebCore::HTMLInputElement* selectedInput() const;
};

And the source:
#include "qwebpageex.h"
#include "config.h"
#include "qwebpage_p.h"

#include "Frame.h"
#include "Page.h"
#include "FocusController.h"
#include "HTMLInputElement.h"
#include "HTMLNames.h"
#include "ClientRect.h"
#include "JSDOMWindow.h"

QWebPageEx::QWebPageEx(QObject *parent) :
   QWebPage(parent)
{
}

QWebPageEx::~QWebPageEx()
{
}

bool QWebPageEx::isTextField() const
{
   const WebCore::HTMLInputElement *input = selectedInput();

   if (input)
   {
      return input->isTextField();
   }

   return false;
}

bool QWebPageEx::isPasswordField() const
{
   const WebCore::HTMLInputElement *input = selectedInput();

   if (input)
   {
      return input->isPasswordField();
   }

   return false;
}

QString QWebPageEx::text() const
{
   const WebCore::HTMLInputElement *input = selectedInput();

   if (input)
   {
      return input->value();
   }

   return QString();
}

void QWebPageEx::setText(const QString& text)
{
   WebCore::HTMLInputElement *input = selectedInput();

   if (input)
   {
       input->setValue(text);
       input->dispatchFormControlChangeEvent();
   }
}

QString QWebPageEx::getAttribute(const QString& attrName)
{
   WebCore::Node *node = selectedNode();

   if (node && node->hasAttributes())
   {
      WebCore::NamedNodeMap *attrs = node->attributes();

      if (attrs)
      {
         WTF::PassRefPtr<WebCore::Node> nd = attrs->getNamedItem(attrName);

         if (nd.get())
         {
            return nd->nodeValue();
         }
      }
   }

   return QString();
}

WebCore::Node* QWebPageEx::selectedNode() const
{
   WebCore::Frame *frame =
handle()->page->focusController()->focusedOrMainFrame();
   if (frame)
   {
      WebCore::Document *document = frame->document();

      if (document)
      {
         WebCore::Node *node = document->focusedNode();

         if (node)
         {
            return node;
         }
      }
   }

   return NULL;
}

WebCore::HTMLInputElement* QWebPageEx::selectedInput() const
{
   WebCore::Node *node = selectedNode();

   if (node && node->hasTagName(WebCore::HTMLNames::inputTag))
   {
      return static_cast<WebCore::HTMLInputElement*>(node);
   }

   return NULL;
}

Andrew

On Tue, Apr 27, 2010 at 3:07 AM, Ivan De Marino
<ivan.de.marino at gmail.com> wrote:
> Input methods in Qt are defined by-platform, and that should not change if
> you are in a QWebView.
> If you want to modify what do you get in terms of Keyboards, Combo-box and
> so forth, you might want to take a look to the actual source code of
> QtWebKit and see where you can "plug yourself" in. It's not going to be an
> easy task, I think.
> It might be that you are raising an interesting point: allowing developers
> to implement/extend the input methods for QWebKit, so that personalized
> Input Methods can be easily added. that's an interesting idea.
> Good luck.
>
> On 27 April 2010 07:39, sunny shah <sunny.cpp at gmail.com> wrote:
>>
>> Hi ,
>>  But I want to make it for Qt for embedded linux ( My windowing server is
>> QWS ( Qt Windowing System) ), I want to mentioned functionality ( Want to
>> make mobile browser similar to iPhone | Android ). Isn't it possible that
>> textbox OR listbox OR combobox  which QtWebkit uses will be derived by me ?
>> Or is there any other way? I am ready to do hacking in code, Just help me
>> for quick start.
>> Many Thanks,
>>   Sunny.
>> On Tue, Apr 27, 2010 at 1:41 AM, Kenneth Christiansen
>> <kenneth.christiansen at openbossa.org> wrote:
>>>
>>> We would all like that :-) but it is a lot of work to get done right.
>>>
>>> With QtWebKit 2.0 which will soon be released, and if your embedded
>>> linux is based on Maemo5, you will get a dialog for selection (what
>>> you call combobox/listbox), event for the multiple selection case. On
>>> other platforms you are out of luck. Virtual keyboard will also work
>>> on that platform.
>>>
>>> Kenneth
>>>
>>> On Mon, Apr 26, 2010 at 2:59 PM, sunny shah <sunny.cpp at gmail.com> wrote:
>>> > Hi,
>>> >
>>> >   I am making mobile browser for Qt for embedded linux. I want to have
>>> > virtual keyboard, separate window for listbox and combo box and custom
>>> > message box styles in QtWebkit. Please help me with this.
>>> >
>>> > Regards,
>>> >  Sunny.
>>> > _______________________________________________
>>> > webkit-qt mailing list
>>> > webkit-qt at lists.webkit.org
>>> > http://lists.webkit.org/mailman/listinfo.cgi/webkit-qt
>>> >
>>> >
>>>
>>>
>>>
>>> --
>>> Kenneth Rohde Christiansen
>>> Technical Lead / Senior Software Engineer
>>> Qt Labs Americas, Nokia Technology Institute, INdT
>>> Phone  +55 81 8895 6002 / E-mail kenneth.christiansen at openbossa.org
>>
>>
>> _______________________________________________
>> webkit-qt mailing list
>> webkit-qt at lists.webkit.org
>> http://lists.webkit.org/mailman/listinfo.cgi/webkit-qt
>>
>
>
>
> --
> Ivan De Marino | Software Engineer | France Telecom R&D UK - Orange Labs
> w. +44 20 8849 5806 | m. +44 7515 955 861 | m. +44 7974 156 216
> ivan[dot]demarino[at]orange-ftgroup.com |
> ivan[dot]de[dot]marino[at]gmail[dot]com
> www.detronizator.org | www.linkedin.com/in/ivandemarino
>
> _______________________________________________
> webkit-qt mailing list
> webkit-qt at lists.webkit.org
> http://lists.webkit.org/mailman/listinfo.cgi/webkit-qt
>
>


More information about the webkit-qt mailing list