2014-11-06 4 views
4

이것에 대해 몇 가지 비슷한 질문을 발견했으나 슬롯 핸들러에서 메시지 상자를 사용하는 경우를 나타냅니다. 내 경우에는 슬롯 핸들러가 아무 것도하지 않아도 editFinished 신호가 두 번 나오기 때문에 조금 붙어있다.Qt : QLine 편집 편집 포커스가 변경되면 신호가 두 번 완료 되었습니까?

테스트를 위해 signalMapper를 사용하여 editingFinished() 신호를 단일 슬롯에 연결하는 QLineEdit 배열이 있습니다. signalMapper는 배열 인덱스를 전달하므로 신호가 어디서 왔는지 알 수 있습니다. 는 예 :

그때 하나 개의 상자에 하나 엔터 데이터를 입력하거나 마우스 (즉, 변경 초점) 다른 상자를 선택하면, 디버거에서 실행
testenter::testenter(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::testenter) 
{ 
    // setup the UI according to the .h file 
    ui->setupUi(this); 

    signalMapper = new QSignalMapper(this); 

    // init the labels and edit boxes 
    for (int i = 0; i < 10; i++) 
    { 
     pm_label[i] = new QLabel(ui->scrollArea); 
     QString text = QString("Number %1").arg(i); 
     pm_label[i]->setText(text); 
     pm_label[i]->setGeometry(10,20+i*30, 50, 20); 
     pm_label[i]->show(); 

     pm_editBox[i] = new QLineEdit(ui->scrollArea); 
     pm_editBox[i]->setGeometry(80,20+i*30, 50, 20); 
     pm_editBox[i]->show(); 

     signalMapper->setMapping(pm_editBox[i], int(i)); 
     connect(pm_editBox[i], SIGNAL(editingFinished()), signalMapper, SLOT(map())); 
    } 
    connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(data_entry(int))); 
} 

void testenter::data_entry(int entry) 
{ 
    //dummy 
} 

은, 그것은 처음에 두 번 data_entry를 호출 초점을 잃고있는 상자의 색인과 초점을 가져 오는 상자로 두 번째.

그럼 내 질문 : 뭔가 빠졌습니까? 이 예상되는 동작이나 버그입니까? 버그가있는 경우,이 신호를 사용하여 입력시 데이터에 대한 사용자 정의 유효성 검사를 수행하려는 경우 (반환, 탭 또는 마우스를 클릭하여 포커스 변경)

+0

Toby, Qt의 신호 슬롯 메커니즘은 씨름하는 재미있는 짐승이 될 수 있습니다. 행동에 직면하게되는 조건은 무엇입니까? (나는.디버깅하지 않고 디버깅하지 않고 두 번 결과가 발생하는 디버거에서) – Lightheart

답변

2

먼저이 동작이 필요하지 않습니다. 예를 들어 QLineEdit을 선택해도 editingFinished 신호가 발생하지 않아야합니다.

이 문제가 발생할 수있는 가능한 몇 가지가 있습니다 : 당신은 실수로 슬롯

  • 슬롯 map()
  • 초점을 잃고 새로 선택한 상자의 원인에 두 번 신호를 연결 한

    • 디버깅 중이고 슬롯을 호출 할 때 브레이크 포인트를 사용하면 활성 응용 프로그램이 QWidget에서 디버거로 바뀔 때 QLineEdit가 포커스를 잃을 수 있으므로 다시 신호를 발생시킬 수 있습니다 다시 보냈습니다.

    슬롯이 두 개 연결되어있어 문제가있는 경우 두 개의 서로 다른 QLineEdit에서 신호가 구체적으로 전달되지 않아 문제가되지 않는 것 같습니다. 연결 유형을 지정하여이 방법을 사용하면 connect 메서드의 끝에 실제로는 추가 옵션 인수가있어서 DefaultConnection에서 UniqueConnection으로 유형을 변경할 수 있습니다.

    데이터 검증은 Qt가 이미 구축 한 메커니즘을 가지고 있으며 가능한 경우 사용하는 것이 좋습니다. QValidator 추상 기본 클래스 Ref Doc을 확장합니다. 그런 다음 각 QLineEdit에 동일한 유효성 검사기를 사용하도록 지시합니다.

    +0

    다른 플레이가 있었고 세 번째 옵션이 문제로 보입니다. 즉. 디버거가 포커스 변경을 일으키고 있습니다. qDebug() << 색인 >><< 항목; 은 정상적으로 작동합니다. 초점 당 하나의 출력 만 변경됩니다. QValidator 함수를 발견했지만 계속 진행하기 전에이 동작을 이해하고 싶었습니다. 모든 정보 주셔서 감사합니다! – Toby

    0

    동일한 문제가 발생했습니다. 실제로 신호를 두 번 내보내는 버그는 알려진 버그입니다 : https://bugreports.qt.io/browse/QTBUG-40 그러나 아주 오랫동안 언급되지 않았습니다.

    마침내 필자의 ​​경우 가장 좋은 해결책은 editingFinished에서 returnPressed으로 신호를 변경하는 것입니다. 부작용으로 이것은 사용자 관점에서 훨씬 더 예측 가능하게 행동합니다. 여기를 참조하십시오 : http://www.qtforum.org/article/33631/qlineedit-the-signal-editingfinished-is-emitted-twice.html?s=35f85b5f8ea45c828c73b2619f5750ba9c686190#post109943

    관련 문제