2011-03-04 2 views
0

내 Qt 응용 프로그램 중 하나 이상에서 메뉴 막대가 클릭 될 때마다 GUI 동작이 호출되기 전에 GUI 내의 위젯에서 보낸 마지막 신호가 다시 전송됩니다. 대부분이 시간은 중요하지 않습니다. 그러나 어떤 경우에는 대단히 중요합니다. 위젯의 신호는 자신의 슬롯 중 하나에 접속되는 드문 경우메뉴 동작을 선택하면 QWidget 신호가 전송됩니다. 어떻게 방지합니까?

는 그것이

if (hasFocus()) 
{ 
    // ... 
} 

으로 슬롯을 시작 간단있어 ... 블록 이러한 스퓨리어스 신호가 아닌 의해 생성하도록 실제로 위젯을 클릭 한 사용자는 무시할 수 있습니다.

그러나 최근에 나는이 동작이 프로그램의 여러 레이어를 통해 가짜 신호가 전달되기 전에 여러 가지 관련 버그가 있음을 확인했습니다. 따라서 특정 위젯에 포커스가 있는지 여부를 간단히 확인하는 것은 쉽지 않습니다 구현.

내 질문에 따라서,이다 :

  • 왜 지구에 메뉴 항목을 클릭이 신호가 다른 화면에 위젯에서 방출되는 원인이 무엇입니까? 어디서나이 동작을 발견 할 수 없습니까?

  • 어떻게 중지합니까?

많은 감사,

스티븐. 당신이 자신을 추론으로

+1

OK ... 고정 ... 내 GUI의 위젯 중 약 80 %는 QLineEdit의 하위 클래스이며 실제로 문제가 발생했습니다. 문제가되는 신호는 QLineEdit :: editingFinished()입니다. 문서에 따르면 "Return 키나 Enter 키를 누르거나 선의 편집이 포커스를 잃을 때"(필자의 강조)입니다. –

+0

문제는 Enter 키를 누를 때 신호가 방출되고 위젯이 포커스를 잃을 때 다시 발생한다는 것입니다. QLineEdit :: editingFinished()를 가로 채기 위해 몇 가지 코드를 서브 클래스에 넣고, 마지막으로 신호가 방출 된 이후 내용이 변경되었는지 확인하고, 변경 사항이있는 경우에만 전달합니다. –

답변

0

QLineEdit::editingFinished 신호는 사용자 언론를 입력 경우 두 번 방출과 QLineEdit 초점 나중에 손실 될 수있다. 오래된 버그가 생성되었지만 동작이 변경되지 않았습니다 : https://bugreports.qt.io/browse/QTBUG-40.

해결 방법 : QLineEdit에 과부하를 걸고 신호를 트리거하기 전에 값이 변경되었는지 확인하십시오. 확인을 위해 QLineEdit::isModified 플래그를 사용할 수 있습니다. 기본값은 false이며 사용자가 회선 편집 내용을 변경할 때마다 true로 변경됩니다.. 신호를 내 보내면 수동으로 false로 재설정해야합니다.

값이 의미가 있는지 (예 : 마지막으로 기록 된 값과 다른지) 확인하고 처리할지 여부도 확인하여 수신자 개체를 체크인 할 수 있습니다.
따라서 오염 신호는 문제가되지 않습니다. 제 의견으로는 가장 깨끗한 솔루션입니다. 그렇다면 견고한 모델입니다. 사용자가 을 누르기 때문에을 동일한 텍스트 값으로 몇 번 입력하면 처리해야합니다.

QLineEdit::returnPressed도 사용할 수 있지만 사용자가 값을 확인하려면 항상 Enter 키를 눌러야합니다. 항상 직관적 인 것은 아니지만 사용자가 입력 내용을 명시 적으로 검증하도록합니다.

관련 문제