[QT/Embedded] QtWebKit을 사용하여 키보드를 웹뷰에 올리려 합니다.

resonancme의 이미지

QtWebKit을 이용하여 인터넷 창을 만들었습니다.

QWebView가 메인 윈도우 위에 있고 툴바도 만들고.. 지금까진 잘됐으나

제가 만든 키보드를 올려야 하는데 어떻게 해야 할지 모르겠습니다.

인터넷 주소창은 QLineEdit로 되어있고 나머진 QWebView로 되어있는데 문제는

이 WebView의 입력이 가능한 곳으로 포커스가 가면 제가 만든 키보드가 show()되고 아니면

hide()가 되게 동작하고 싶은데 어찌해야할지 모르겠습니다.

제 생각엔 아무래도 Webview를 상속받아 커스터마이징 해야할듯한데 도와주세요.

jachin의 이미지

직접 만드신 키보드는 Qt/E 로 작성하신 것인가요?
Qt/E 키보드 드라이버에 메시지가 전달하도록 만드신건가요?
웹 뷰 객체 위에 표시를 하시길 원하신다면,
포커스 이벤트 발생시
키보드의 show(), hide() 메소드를 호출하시는 것으로 충분하지 않을까요?
표시될 객체의 순서가 바뀌어서 창 밑으로 뜰지도 모르지만요. :)

익명_사용자의 이미지

질문이 바로 그 "포커스 이벤트 발생시"를 어떻게 잡아야할지 모른다는것 아닌가요?
저도 간단한 inputEvent() event(), focus() 등등 이벤트 핸들러를 체크해봤는데,

WebElement단위로 발생하더군요. 근데 그 포커스 된 WebElement가 ( 예를들어, 링크, 콤보박스, 텍스트,

등등 )
질문자님이 말씀하신것처럼 "입력이 가능한" WebElement인지 알기가 쉽지 않더군요.

전, 조금 뒤져보다가 말았습니다;;

jachin의 이미지

대부분 Qt에서 할당한 객체에 대해 메소드를 찾아볼 때,
해당 클래스에 없으면, 유전받은 상위 클래스를 찾아보면 나오거든요. ^^;
WebElement 단위가 QWebPage 객체와 관련이 있는지는 모르겠지만,
입력이 가능한 객체에서만 포커스 이벤트라... ( ' ')a 음...

resonancme의 이미지

QWebView* view = new QWebView();
view->page() 로 해서 connect를 헸습니다. 문제는

적당한 시그널 함수가 없다는 것이죠;;

connect(view->page(), SIGNAL(포커스 시그널함수(element* el)), this, SLOT(show_keyboard()));

위와 같은 식으로 연결하면 되지만

웹뷰 어디를 뒤져봐도, 웸페이지 어디를 뒤져봐도 위와같은 역할을 하는 시그널 함수가 없었어요...

결국 QWebPage 를 상속받아서 커스터마이징 해야할듯한데 혹 이에 대해 아시는게 있으시면 알려주세요;;

jachin의 이미지

아마 찾으시는 메소드는 QWebkit 의 QWebElement 클래스 hasFocus() 메소드와 관련있을겁니다. :)
QWebElement에서 입력태그 관련 DOM들이 hasFocus() 리턴값을 갖게 될 때 이벤트를 받으시면 될겁니다.
요거... 제가 지금 바로 시간이 없어서, 일단 나중에 또 알려드리겠습니다. ^^;;;

jachin의 이미지

일단 Qt QWebView를 구글에서 검색해서 메뉴얼 페이지를 확인해보면,
QWebView 클래스가 QWebPage와 QWebFrame으로 구성되어 있다는 것을 아실 수 있으실 겁니다.
QWebView는 QWidget을 상속받은 클래스이구요.
QWebView 로 만든 객체에는 QWidget으로부터 상속받은 메소드들을 쓸 수 있습니다.

bool QWidget::hasEditFocus() const함수를 쓰시면, 입력 포커스가 잡힐 때마다 키보드를 보여주실 수 있으실거라 생각합니다. QWidget의 오래된 기능 중 하나이니, 분명 있을겁니다. 직접 해봐야 하는데, 실험할 수 있는 상황이 아니라서.. ^^;;;;

resonancme의 이미지

답변감사드립니다.

하지만 이 hasEditFoucs()라는 함수는 리눅스 환경에서만 사용가능하다는 군요;;

제가 wince 환경에서 프로그래밍을 하고 있습니다. 혹 wince에서 쓸수 있는 동일한 기능의 함수가 있는지요?

jachin의 이미지

아아... 그렇다면, 이건 Windows CE 의 API를 연계해야 해요.
Windows CE 환경의 Qt Embedded 소스를 직접 확인해보면 됩니다만...
음... 좀 광범위하기도 하고요, 소스를 잘 찾아가실 자신이 있으시다면,
권장해드리고 싶지만... 음... 그건 또 어렵고...
8월 22일 이후라면, 직접 찾아드릴 수도 있겠는데...
그 때 까지 기다리시긴 무리실지도... ^^;;;

resonancme의 이미지

8월 22일 이후라도 괜찮습니다.

제가 이제 입문자라 말씀하신걸 할 실력이 안될것 같습니다.

가능하시다면 부탁드립니다. ㅜㅜ

안되면 힌트라두요^^;;

인터넷을 많이 찾아봐도 이와 관련된 내용을 얻기가 너무 어렵군요;; 여튼 지금까진 한건도 없었답니다;;;ㅜㅜ

jachin의 이미지

잘 기억하고 있다가 찾아보도록 하겠습니다.

WinCE 개발환경 버전같은 제한은 없으신가요?
저도 오랫만에 Qt Embedded 를 볼 생각에 흥분됩니다.
아아... 그립고나... 그린폰... ( ' ')a

resonancme의 이미지

감사합니다.

wince 2005에요

Qt버전은 4.7.3입니다.

jachin의 이미지

오래 기다리셨죠? :)

어제는 조금 놀아버린 덕분에, 답변글이 좀 늦었습니다. ^^;

윈도우즈 CE용 Qt Embedded 소스 4.6.4 버전을 확인해봤습니다. 3rdparty 안의 webkit 모듈 소스에서 WebCore/page 안의 소스 중 FocusController.cpp 파일 안에 있는 내용을 한 번 확인해보았습니다. 그 중에서 static void clearSelectionIfNedded(Frame*, Frame*, Node*) {} 함수의 일부분이 특정 Frame의 이벤트를 통해서, 입력 가능한 엘리먼트를 확인하는 부분의 소스를 보았습니다.

SelectionController* s = oldFocusedFrame->selection();
if (s->isNone())
    return;

bool caretBrowsing = oldFocusedFrame->settings()->caretBrowsingEnabled();
if (caretBrowsing)
    return;

Node* selectionStartNode = s->selection().start().node();
if (selectionStartNode == newFocusedNode || selectionStartNode->isDescendantOf(newFocusedNode) || selectionStartNode->shadowAncestorNode() == newFocusedNode)
    return;

if (Node* mousePressNode = newFocusedFrame->eventHandler()->mousePressNode())
    if (mousePressNode->renderer() && !mousePressNode->canStartSelection())
        if (Node* root = s->rootEditableElement())
            if (Node* shadowAncestorNode = root->shadowAncestorNode())
                // Don't do this for textareas and text fields, when they lose focus their selections should be cleared
                // and then restored when they regain focus, to match other browsers.
                if (!shadowAncestorNode->hasTagName(inputTag) && !shadowAncestorNode->hasTagName(textareaTag))
                    return;

맨 아래의 if 문단이 관련된 소스코드이고요, s->rootEditableElement() 메소드 함수, 즉 Frame의 메소드로 이벤트를 얻을 수 있을 것 같습니다. 별도의 클래스로 만들어서 크로스 컴파일 하셔도 좋고요, 아니면 상속관계를 보아서, 최하위 객체에 관련 메소드를 호출하는 것도 방법일 것 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.