내 Qt 응용 프로그램 중 하나 이상에서 메뉴 막대가 클릭 될 때마다 GUI 동작이 호출되기 전에 GUI 내의 위젯에서 보낸 마지막 신호가 다시 전송됩니다. 대부분이 시간은 중요하지 않습니다. 그러나 어떤 경우에는 대단히 중요합니다. 위젯의 신호는 자신의 슬롯 중 하나에 접속되는 드문 경우메뉴 동작을 선택하면 QWidget 신호가 전송됩니다. 어떻게 방지합니까?
는 그것이
if (hasFocus())
{
// ...
}
으로 슬롯을 시작 간단있어 ... 블록 이러한 스퓨리어스 신호가 아닌 의해 생성하도록 실제로 위젯을 클릭 한 사용자는 무시할 수 있습니다.
그러나 최근에 나는이 동작이 프로그램의 여러 레이어를 통해 가짜 신호가 전달되기 전에 여러 가지 관련 버그가 있음을 확인했습니다. 따라서 특정 위젯에 포커스가 있는지 여부를 간단히 확인하는 것은 쉽지 않습니다 구현.
내 질문에 따라서,이다 :
이왜 지구에 메뉴 항목을 클릭이 신호가 다른 화면에 위젯에서 방출되는 원인이 무엇입니까? 어디서나이 동작을 발견 할 수 없습니까?
어떻게 중지합니까?
많은 감사,
스티븐. 당신이 자신을 추론으로
OK ... 고정 ... 내 GUI의 위젯 중 약 80 %는 QLineEdit의 하위 클래스이며 실제로 문제가 발생했습니다. 문제가되는 신호는 QLineEdit :: editingFinished()입니다. 문서에 따르면 "Return 키나 Enter 키를 누르거나 선의 편집이 포커스를 잃을 때"(필자의 강조)입니다. –
문제는 Enter 키를 누를 때 신호가 방출되고 위젯이 포커스를 잃을 때 다시 발생한다는 것입니다. QLineEdit :: editingFinished()를 가로 채기 위해 몇 가지 코드를 서브 클래스에 넣고, 마지막으로 신호가 방출 된 이후 내용이 변경되었는지 확인하고, 변경 사항이있는 경우에만 전달합니다. –