[QT/Embedded] QtWebKit을 사용하여 키보드를 웹뷰에 올리려 합니다.
글쓴이: resonancme / 작성시간: 수, 2011/08/10 - 10:58오후
QtWebKit을 이용하여 인터넷 창을 만들었습니다.
QWebView가 메인 윈도우 위에 있고 툴바도 만들고.. 지금까진 잘됐으나
제가 만든 키보드를 올려야 하는데 어떻게 해야 할지 모르겠습니다.
인터넷 주소창은 QLineEdit로 되어있고 나머진 QWebView로 되어있는데 문제는
이 WebView의 입력이 가능한 곳으로 포커스가 가면 제가 만든 키보드가 show()되고 아니면
hide()가 되게 동작하고 싶은데 어찌해야할지 모르겠습니다.
제 생각엔 아무래도 Webview를 상속받아 커스터마이징 해야할듯한데 도와주세요.
Forums:
키보드가 무엇으로 만들어졌는지...
직접 만드신 키보드는 Qt/E 로 작성하신 것인가요?
Qt/E 키보드 드라이버에 메시지가 전달하도록 만드신건가요?
웹 뷰 객체 위에 표시를 하시길 원하신다면,
포커스 이벤트 발생시
키보드의 show(), hide() 메소드를 호출하시는 것으로 충분하지 않을까요?
표시될 객체의 순서가 바뀌어서 창 밑으로 뜰지도 모르지만요. :)
질문이 바로 그 "포커스 이벤트 발생시"를 어떻게
질문이 바로 그 "포커스 이벤트 발생시"를 어떻게 잡아야할지 모른다는것 아닌가요?
저도 간단한 inputEvent() event(), focus() 등등 이벤트 핸들러를 체크해봤는데,
WebElement단위로 발생하더군요. 근데 그 포커스 된 WebElement가 ( 예를들어, 링크, 콤보박스, 텍스트,
질문자님이 말씀하신것처럼 "입력이 가능한" WebElement인지 알기가 쉽지 않더군요.
전, 조금 뒤져보다가 말았습니다;;
앗, 질문 내용을 잘못 알고 있었네요. ^^
대부분 Qt에서 할당한 객체에 대해 메소드를 찾아볼 때,
해당 클래스에 없으면, 유전받은 상위 클래스를 찾아보면 나오거든요. ^^;
WebElement 단위가 QWebPage 객체와 관련이 있는지는 모르겠지만,
입력이 가능한 객체에서만 포커스 이벤트라... ( ' ')a 음...
QWebView* view = new
QWebView* view = new QWebView();
view->page() 로 해서 connect를 헸습니다. 문제는
적당한 시그널 함수가 없다는 것이죠;;
connect(view->page(), SIGNAL(포커스 시그널함수(element* el)), this, SLOT(show_keyboard()));
위와 같은 식으로 연결하면 되지만
웹뷰 어디를 뒤져봐도, 웸페이지 어디를 뒤져봐도 위와같은 역할을 하는 시그널 함수가 없었어요...
결국 QWebPage 를 상속받아서 커스터마이징 해야할듯한데 혹 이에 대해 아시는게 있으시면 알려주세요;;
질문 내용을 곡해해서 자세한 설명을 못 드렸네요. ^^;
아마 찾으시는 메소드는 QWebkit 의 QWebElement 클래스 hasFocus() 메소드와 관련있을겁니다. :)
QWebElement에서 입력태그 관련 DOM들이 hasFocus() 리턴값을 갖게 될 때 이벤트를 받으시면 될겁니다.
요거... 제가 지금 바로 시간이 없어서, 일단 나중에 또 알려드리겠습니다. ^^;;;
시그널의 방향 결정이 중요!
일단 Qt QWebView를 구글에서 검색해서 메뉴얼 페이지를 확인해보면,
QWebView 클래스가 QWebPage와 QWebFrame으로 구성되어 있다는 것을 아실 수 있으실 겁니다.
QWebView는 QWidget을 상속받은 클래스이구요.
QWebView 로 만든 객체에는 QWidget으로부터 상속받은 메소드들을 쓸 수 있습니다.
bool QWidget::hasEditFocus() const함수를 쓰시면, 입력 포커스가 잡힐 때마다 키보드를 보여주실 수 있으실거라 생각합니다. QWidget의 오래된 기능 중 하나이니, 분명 있을겁니다. 직접 해봐야 하는데, 실험할 수 있는 상황이 아니라서.. ^^;;;;
답변감사드립니다.
답변감사드립니다.
하지만 이 hasEditFoucs()라는 함수는 리눅스 환경에서만 사용가능하다는 군요;;
제가 wince 환경에서 프로그래밍을 하고 있습니다. 혹 wince에서 쓸수 있는 동일한 기능의 함수가 있는지요?
으윽! 이런 변수가 있었을 줄이야!!!
아아... 그렇다면, 이건 Windows CE 의 API를 연계해야 해요.
Windows CE 환경의 Qt Embedded 소스를 직접 확인해보면 됩니다만...
음... 좀 광범위하기도 하고요, 소스를 잘 찾아가실 자신이 있으시다면,
권장해드리고 싶지만... 음... 그건 또 어렵고...
8월 22일 이후라면, 직접 찾아드릴 수도 있겠는데...
그 때 까지 기다리시긴 무리실지도... ^^;;;
해결만 된다면!!^__^
8월 22일 이후라도 괜찮습니다.
제가 이제 입문자라 말씀하신걸 할 실력이 안될것 같습니다.
가능하시다면 부탁드립니다. ㅜㅜ
안되면 힌트라두요^^;;
인터넷을 많이 찾아봐도 이와 관련된 내용을 얻기가 너무 어렵군요;; 여튼 지금까진 한건도 없었답니다;;;ㅜㅜ
넵. 그럼 22일 이후에...
잘 기억하고 있다가 찾아보도록 하겠습니다.
WinCE 개발환경 버전같은 제한은 없으신가요?
저도 오랫만에 Qt Embedded 를 볼 생각에 흥분됩니다.
아아... 그립고나... 그린폰... ( ' ')a
감사합니다.
감사합니다.
wince 2005에요
Qt버전은 4.7.3입니다.
하루 좀 늦었습니다. ^^
오래 기다리셨죠? :)
어제는 조금 놀아버린 덕분에, 답변글이 좀 늦었습니다. ^^;
윈도우즈 CE용 Qt Embedded 소스 4.6.4 버전을 확인해봤습니다. 3rdparty 안의 webkit 모듈 소스에서 WebCore/page 안의 소스 중 FocusController.cpp 파일 안에 있는 내용을 한 번 확인해보았습니다. 그 중에서 static void clearSelectionIfNedded(Frame*, Frame*, Node*) {} 함수의 일부분이 특정 Frame의 이벤트를 통해서, 입력 가능한 엘리먼트를 확인하는 부분의 소스를 보았습니다.
맨 아래의 if 문단이 관련된 소스코드이고요, s->rootEditableElement() 메소드 함수, 즉 Frame의 메소드로 이벤트를 얻을 수 있을 것 같습니다. 별도의 클래스로 만들어서 크로스 컴파일 하셔도 좋고요, 아니면 상속관계를 보아서, 최하위 객체에 관련 메소드를 호출하는 것도 방법일 것 같습니다.
댓글 달기