2010-05-25 7 views
6

버튼 클릭 슬롯에서 NULL 부모가있는 대화 상자를 만들고 exec() 대화 상자를 엽니 다. 대화 상자의 생성자 안에는 다음이 있습니다.Qt의 표시된 대화 상자에 입력 포커스를 설정하는 방법은 무엇입니까?

this->activateWindow(); 
this->raise(); 
this->setFocus(); 

대화 상자는 응용 프로그램 모달이며 매우 집중적으로 사용됩니다. 그러나 키보드 이벤트를 클릭하기 전까지는 키보드 이벤트에 응답하지 않습니다. 어떻게 대화 상자를 클릭하지 않고 포커스를 얻게합니까?

답변

5

문제점은 Qt : Tool 창 플래그를 설정하는 것이 었습니다. 대신 Qt :: Popup 또는 Qt :: Window를 사용하면 대화 상자가 표시 될 때 입력 포커스가 자동으로 설정됩니다.

Qt :: Window를 직접 사용했습니다. 다른 플래그 중 일부는 잘 작동하지만 가장 중요한 점은 Qt :: Tool 플래그가있는 QDialog는 이 아니며은 대화 상자가 표시 될 때 자동으로 입력 포커스를 설정한다는 것입니다.

-1

대화 상자의 이벤트 필터를 설치하십시오.

classObject->installEventFilter(this); 

void className::keyPressEvent(QKeyEvent *event) 
{ 
    if (event->key() == Qt::Key_Space) 
    { 
    focusNextChild(); 
    } 
    else 
    { 
    QLineEdit::keyPressEvent(event); 
    } 
} 

자세한 내용은 여기를 참조하십시오. http://doc.trolltech.com/4.6/eventsandfilters.html

+0

클래스는 다음과 같은 창 플래그가 설정된 QDialog 파생 클래스입니다.'(Qt :: CustomizeWindowHint | Qt :: FramelessWindowHint | Qt :: Tool | Qt :: WindowStaysOnTopHint' 그것은 자식이없고 부모도 없습니다. –

+0

예, 키보드 이벤트를 가져오고, 대화 상자에 이벤트 필터를 설치하고, 대화 상자 생성자에서 this-> installEventFilter (this)를 작성하고, 위의 샘플에서 "focusNextChild()"함수를 사용하십시오. ? 대화 목자 파일에 그래서 당신이 뜻 – Naruto

+0

위와 같이 keyPressEvent 기능과 CPP 파일 구현을 제공 선언 this-> installEventFilter (이) 무효 QDialogDerived :: keyPressEvent (QKeyEvent * 이벤트) { QLineEdit :: keyPressEvent (이벤트); // 여기에서 처리합니까? } –

-1

제 경우에도 설정 Qt :: Window가 트릭을하지 않았습니다. 나는 show() 또는 exec() 전에

QMetaObject::invokeMethod(widgetToFocus, "setFocus", Qt::QueuedConnection); 

했다.

관련 문제