2014-06-17 1 views
9

는 : Associate signal and slot to a qcheckbox create dynamically 나는 연결해야합니다 :QSignalMapper는 어떻게 작동합니까? 여기에 내 게시물 후

을 신호 clicked() • 내 함수에 qCheckBox 클릭하면 cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)

그래서, 내가 노력하고 2 시간 후, QSignalMapper를 사용해야합니까하려면 어떻게 작동하는지 이해하기 위해, 나는 좋은 결과를 가질 수 없습니다, 여기에 내가 만드는 코드이 분명히 잘못입니다 : 당신은 나에게

QSignalMapper *m_sigmapper = new QSignalMapper(this); 
QObject::connect(pCheckBox, SIGNAL(mapped(QTableWidget*,int, QCheckBox*)), pCheckBox, SIGNAL(clicked())); 
QObject::connect(this, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox))); 

m_sigmapper->setMapping(pCheckBox, (monTab,ligne, pCheckBox)); 
QObject::connect(m_sigmapper, SIGNAL(clicked()),this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox))); 

를 설명 할 수 어떻게 QSignalMapper 작품? . 난 정말 당신이 그것을 필요로하지 않는 이유 QSignalMapper 작품 그럼 난 당신을 설명하는 방법을 설명합니다 :(

+0

왜 QSignalMapper를 사용해야합니까? 어떤 특별한 이유? 이것은 직접 연결로 쉽게 할 수 있습니다. – Rakib

+0

음, 다른 게시물에서는 신호가 더 많은 매개 변수로 슬롯에 연결할 수없고 clicked 신호()에 매개 변수가 없다는 것을 설명합니다. 또한이 세 가지 매개 변수가 필요합니다. –

+0

사실, 슬롯은 해당 신호와 같거나 적은 수의 매개 변수를 가질 수 있습니다. 그러나 매개 변수를 필요로하지 않는 슬롯을 작성한 다음, 필수 매개 변수를 사용하여 실제 슬롯/메소드를 호출하십시오. – Rakib

답변

11

QSignalMapper 클래스는 매개 변수없는 신호 집합을 수집하고 신호를 보낸 객체에 해당하는 정수, 문자열 또는 위젯 매개 변수로 다시 방출합니다. 그래서 당신은 같은 하나를 가질 수, clicked()가 버튼에서 신호를 때 있도록 QSignalMappermap() 슬롯에 clicked() 신호를 연결하고 setMapping를 사용하여 매핑을 추가 할 수있는 신호를 당신의 각 버튼에 대한

QSignalMapper * mapper = new QSignalMapper(this); 
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *))); 

mapped(QWidget *) 방출 :

QPushButton * but = new QPushButton(this); 

QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map())); 
mapper->setMapping(but, but); 

당신이 버튼을 클릭 할 때마다이 방법은 매퍼의 mapped(QWidget *) 신호는 매개 변수로 위젯을 포함하는 방출된다.

+0

고마워요! 그것은 작동하지만 어떻게 3 개의 매개 변수를 넣을 수 있습니까? 이것이 가능한가 ? 때문에 매핑 된 때문에 (QWidget *) –

+0

하나만 넣을 수 있기 때문에 하나 이상의 매개 변수를 가질 수 없습니다. 다른 위젯을 클래스 멤버로 사용하여 슬롯에서 액세스 할 수 있습니다. – Nejat

+0

반원이란 무엇을 의미합니까? 매개 변수로 전달할 수 없다면 어떻게 찾을 수 있습니까? –

6

첫째로 연결하는 것을 이해하지

어떻게 QSignalMapper 작동합니다.

는. 그래서 당신은 모든 체크 박스를 클릭 할 때마다, 당신은 할당 된 정수 값을 갖는 신호를 얻을 것이다, 당신은 각각의 체크 박스에 정수 값을 할당한다고 가정하자.의 QSignalMapper 만들기

은 매퍼 신호를 연결합니다 당신의 슬롯에, t 당신이 구현할 모자 :

connect(mapper, SIGNAL(mapped(int)), this, SLOT(yourSlot(int))); 

이제 정수 인수를 취할 슬롯을 작성할 수 있습니다. 인수는 각 확인란마다 다릅니다. 각 당신이 다음을 수행해야하는 체크 박스

하면, 체크 박스를 생성하는 동안 : 지금부터

mapper->setMapping(checkBox, integerValueForThisCheckbox); 
connect(checkBox, SIGNAL(clicked()), mapper, SLOT(map())); 

, 당신은 체크 박스를 클릭 할 때마다, 그것의 QSignalMapperclicked() 신호를 방출 할지도 다음 것 그것을 할당 된 정수 값으로 변환하고 mapped() 신호를 방출합니다. 해당 mapped() 신호에 연결되어 있으므로 yourSlot(int)이 적절한 정수 값으로 호출됩니다.

정수 대신 정수 QString, QWidget* 또는 QObject*을 할당 할 수 있습니다 (Qt 문서 참조).

이것은 QSignalMapper의 작동 방식입니다.

당신은 그것을 필요가 없습니다

  • QTableWidget *monTab은 단일 개체, 그것은 변경되지 않습니다. 그것을 클래스 멤버 필드로 유지하고 슬롯 기능에서 사용하십시오.
  • QCheckBox *pCheckBox - sender()에서 QCheckBox*으로 캐스팅하여 얻을 수 있습니다. 이처럼

:

void supervision::yourSlot() 
{ 
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender()); 
    if (!pCheckBox) // this is just a safety check 
     return; 
} 

sender() 기능은 당신이 그것을에 액세스 할 수 있도록, 상속 할 QObject에서입니다.

  • int linge (그것은 바로, 행 번호입니까?) - 당신이 체크 박스를 만들 때, 당신은 다음과 같이, 그것을 어떤 줄 알아 QList 클래스 필드에서 그 체크 박스에 대한 포인터를 저장하고 슬롯 기능에서 사용할 수 있습니다 :

    private: 
        QList<QCheckBox*> checkboxes; 
    

    하는 생성의 체크 박스 :

    QCheckBox* cb = new QCheckBox(); 
    checkboxes << cb; 
    
    클래스 선언에서

당신의 슬롯 기능에 16,

: 당신이 원하는 경우

void supervision::yourSlot() 
{ 
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender()); 
    if (!pCheckBox) // this is just a safety check 
     return; 

    int linge = checkboxes.indexOf(pCheckBox); 
} 

, 당신은 QList 것을 건너 뛰고 QSignalMapper를 사용하고 매퍼를 사용하여 체크 박스에 라인을 할당 할 수 있습니다. 그것은 단지 당신이 선호하는 것의 문제입니다.

+0

아주 좋은 답변을 주셔서 감사합니다. 내 문제는 거기에 여러 QTableWidget, QSignalMapper 사용하지 않는 경우,이 QTableWidget에 액세스 할 내 방식은 내가 생각하는 QCheckBox에 parent()를 사용하는 것입니다. 그것은 많은 트릭을 사용하는 것처럼 보이며 문제를 일으킬 수 있습니다. 왜냐하면 코드가 유연해야하기 때문입니다. 그래서 나는 처음에 QSignalMapper를 시도 할 것입니다.그것에 대해 자세히 설명해 주시겠습니까? (미안하지만 이해하기가 어렵습니다.) –