2014-06-17 4 views
0

매우 구체적인 문제가 있으므로 최대한 명확하게하려고 노력할 것입니다.qcheckbox에 신호와 슬롯을 연결하면 동적으로 생성됩니다.

나는 QTableWidget을 포함하는 을 가지고 있는데, 내 QTableWidget의 모든 라인은 파일을 읽음으로써 동적으로 생성됩니다. 당신이 볼 수있는 바와 같이 나는 선을 만들 때

myTab

는, 나는 마지막에 qCheckBox를 추가합니다. 이제 내 목표는 qCheckBox을 클릭하고 qCheckBox의 선택을 취소 할 때이 줄을 삭제할 때 내 QtableTab의 마지막 탭에있는 QTableWidget에이 줄을 보내는 것입니다.

그래서 내가 동적으로 라인을 만들 때마다, 나는 내 qCheckBox에 신호 연결을 시도 :

QObject::connect: No such slot supervision::cliqueCheckBox(monTab,ligne, pCheckBox) 
:

QObject::connect(pCheckBox, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(monTab,ligne, pCheckBox))); 

을하지만이 작동하지 않습니다, 나는 오류를 가지고

그러나이 슬롯이 존재, 내 헤더 파일에 선언하고이 같은 내 CPP :

void supervision::cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox) 

이 문제를 해결하기 위해 제 자신의 길은 좋은가? 그렇다면 올바르게 신호를 슬롯에 연결하는 방법과없는 경우, 어떻게 진행합니까?

감사합니다.

[편집] 다음은 qCheckBox을 만들어 내 함수의 코드이고 동적으로 관련된 :

void supervision::ajouterCheckBox(QTableWidget *monTab, int ligne){ 
    // Creation de la check box 
    QWidget *pWidget = new QWidget(); //Creation du widget contenant la checkbox 
    QCheckBox *pCheckBox = new QCheckBox(); // Creation de la checkbox 
    QHBoxLayout *pLayout = new QHBoxLayout(pWidget); // Layout pour centrer ma checkbox 
    pLayout->addWidget(pCheckBox); // Ajout de la check box au layout 
    pLayout->setAlignment(Qt::AlignCenter); //Alignement 
    pLayout->setContentsMargins(0,0,0,0);//Supression des bordure 
    pWidget->setLayout(pLayout);//Mise en place du layout dans le widget 
    monTab->setCellWidget(ligne,5,pWidget);//Mise en place du widget contenant la checkbox dans ça cellule 

    //Mise en place de la connection 
    QObject::connect(pCheckBox, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(monTab,ligne, pCheckBox))); 
} 
+1

'감독'이란 무엇입니까? 네임 스페이스 또는 클래스? – JBL

+0

감독은 수업입니다. –

+1

슬롯을 연결할 때이 클래스의 멤버 함수에 있음을 확인할 수 있습니까? – JBL

답변

0

SIGNAL(clicked())SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)을 연결하면 유효하지 않습니다. 신호와 슬롯의 인수는 일치해야합니다. 여기에서는 대상 슬롯에 대한 매개 변수를 제공하지 않습니다.

올바른 형식은 다음과 같습니다 Qt documentation에서

void myClass::clickedCheckBox() 
{ 
    ... 
} 
+1

매개 변수가 필요합니다. 어떻게해야합니까? –

+0

위젯에 대한 포인터가 클래스 멤버로 있어야합니다. 그런 다음 클래스의 모든 슬롯에서 액세스 할 수 있습니다. – Nejat

+0

많은 qCheckBox를 추가하므로 많은 포인터가 있습니다. 3 개의 매개 변수로 내 신호를 만들 수 있습니까? –

1

는 사실, 당신이 당신의 연결에 문제가 생겼어요.

실제로 매개 변수가 0 인 신호를 세 개의 매개 변수를 사용하는 슬롯에 연결하면 작동하지 않습니다.

신호를 슬롯에 연결할 때 시그너처가 일치해야하며 (또는 슬롯이 더 적은 수의 args를 사용해야 함) 런타임시 오류가 발생합니다. 사실, 귀하의 경우 슬롯은 신호가 보내지 않을 인수를 기대합니다.

서명을 일치시키는 방법을 찾아야합니다.

EDIT : 추가 한 코드와 관련해서는 아니요, 매개 변수로 연결을 선언 한 범위에있는 변수를 사용할 수 없습니다. 슬롯의 인수는 관련 신호 (들)에서만 올 수 있습니다.

+0

그래서이 매개 변수를 삭제하거나 신호에 추가합니다 (신호를 생성하게합니까?)? –

+1

여러 옵션이 있습니다. clicked에 연결된 0 개의 매개 변수로 슬롯을 만들면 올바른 인수로 올바른 함수를 호출하는 방법을 찾을 수 있습니다. [** 고급 신호 및 슬롯 매핑] (http://qt-project.org/doc/qt-4.8/signalsandslots.html#advanced-signals-and-slots-usage)에 대한 Qt의 문서에 대한 도움을 얻을 수 있습니다. – JBL

0

:

신호 또는 슬롯을 포함하는 모든 클래스

QObject::connect(pCheckBox, SIGNAL(clicked()), this, SLOT(clickedCheckBox())); 

그리고 clickedCheckBox 슬롯이 위젯의 ​​포인터에 액세스 할 수 있어야합니다 선언 맨 위에 Q_OBJECT를 언급해야합니다. 또한 QObject에서 (직접 또는 간접적으로) 파생되어야합니다.

class X : public QObject 
{ 
    Q_OBJECT 
    ... 
}; 

당신은 당신의 클래스 선언에 슬롯을 선언해야합니다 :

public slots: 
    void cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox); 

여부를 신호에 인수를 포함하는 여부에 대한 규칙()와 SLOT() 매크로, 인수가 디폴트 값이있는 경우, SIGNAL() 매크로에 전달 된 서명이 SLOT() 매크로에 전달 된 서명보다 적은 인수를 가져야한다는 것입니다.