2010-01-30 7 views
2

QTextEdits에 대한 textChanged() 신호를 추적하려고합니다. 신호를 방출하는 텍스트 편집과 상관없이 동일한 작업을 수행하고 싶습니다. QListWidget의 관련 체크 박스가 비어있는 경우 선택을 취소하고 그렇지 않으면 체크 된 채로 두십시오. 현재의 접근 방식으로Qt의 단일 슬롯에 여러 신호 연결하기

void MainWindow::changed() 
{ 
    QString tempStr = ui->hNMRedit->toPlainText(); 
    if(tempStr != "") 
    { 
     ui->checkList->item(0)->setCheckState(Qt::Checked); 
    } 
    else 
    { 
     ui->checkList->item(0)->setCheckState(Qt::Unchecked); 
    } 
} 

나는 모든은 QTextEdit이 같은 기능을해야 할 것, 다음과 같이 I가 지금 가지고있는 기능입니다 각 기능은 사실상 동일한 코드를 포함합니다. 배열에 각 텍스트 편집 내용을 저장하면 QListWidget에서 관련 인덱스를 찾을 수 있습니다. 이렇게 슬롯을 가질 수 있습니까?

void MainWindow::changed(QWidget *sender) // for whichever text edit emits the 
              // textChanged() signal 
{ 
    QString tempStr = sender->toPlainText(); 
    if(tempStr != "") 
    { 
     // I would potentially use some sort of indexOf(sender) function on the array I 
     // mentioned earlier here... a little new to Qt, sorry 
     ui->checkList->item(array.indexOf(sender))->setCheckState(Qt::Checked); 
    } 
    else 
    { 
     // same as above... 
     ui->checkList->item(array.indexOf(sender))->setCheckState(Qt::Unchecked); 
    } 
} 

이 가능 또는 그냥 모든 텍스트 편집에 대해 별도의 슬롯을 작성해야합니까? 추가 설명이 필요하면 알려주세요.

마지막으로 QLineEdits와 QTextEdits 간의 유일한 의미있는 차이가 기본 크기 인 것처럼 느낍니다. 일관성있게 유지하기 위해 UI 전체에서 이러한 객체 중 하나만 사용해야합니까?

감사합니다 !!!

답변

3

나는 슬롯과 신호의 요점을 놓치고 있다고 생각합니다. 어떻게 연결을 만들고 있습니까? 텍스트 상자가 변경되면 확인란을 선택하려고합니까? 그렇다면 QSignalMapper을 사용하여 textChanged() 신호를 매핑하여 true 값을 보내고 QCheckBox setChecked(bool) 슬롯에 연결합니다.

너무 복잡하여 QCheckBox 하위 클래스를 만들고 checkBox()uncheckBox() 집합을 만들어 변수없이 상태를 전환 할 수 있습니다. 이것은 당신이 텍스트 대신 모든은 QTextEdit

+0

나는 QSignalMapper에 동의합니다 ... 그것은 배열 기반 관리를 훨씬 쉽게 만듭니다. –

+0

좋은 소리지만 QSignalMapper를 사용해 보도록하겠습니다. 유일한 어려운 부분은 QCheckBoxes가 QListWidget에있는 것입니다 ... 내가 설명 된 것처럼 확인 된 슬롯에 연결할 수 있는지 여부를 모르겠습니다. 아직도 일할 수있을 것이라고 생각하십니까? 앞서 언급 한 단일 슬롯에 연결하려는 일부 QLineEdits도 있습니다. 편의상, QTextEdits로 모두 변경해야합니다 (그래서 배열에 저장하고 동일한 함수를받는 객체에 사용할 수 있습니다). –

+0

'QCheckBoxes' : 예, 생성 당시 또는 이후에 액세스 할 수 있습니다. 목록에 넣은 후 액세스하려고하면 항목 가져 오기 기능 중 하나를 호출 한 후 포인터를 보관하거나 캐스트해야합니다. 'QLineEdits' :'QWidget' 포인터로 저장하고 특정 기능이 필요할 때 캐스팅하지 않아도됩니다. –

0

에 대한 코드를 복제의 변경 때 변경할 수있는 QCheckBox에 걸릴 QTextEditto 적어도 서브 클래스를 찾고 있습니다하지 것입니다 경우 하위 클래스에 checkBox()

을은 QTextEdit textChanged() 연결 필요한 것은 QAbstractButton*의 해시이며, 키는 QTextEdit*입니다. 슬롯에서 해시에서 sender()을 찾았습니다. 필요한 버튼이 있으면 찾았습니다. 정확히 QSignalMapper에 의해 수행되는 것입니다. 발신자 QWidget*에서 QWidget*으로 매핑 할 수 있습니다. qobject_cast을 사용하여 QAbstractButton*으로 전송하십시오.