2009-05-02 4 views
0

나는 Qt의 신호 및 슬롯 메커니즘을 이해하려고 노력 중이다. QPushButton 및 QSpinBox 응용 프로그램이 있습니다. 버튼을 클릭하면 스핀 상자가 20으로 바뀌기를 원합니다. 어떤 신호와 슬롯을 설정해야합니까?Qt에서 스핀 상자를 특정 값으로 설정하려면 어떻게해야합니까?

아래 코드는 앱을 보여 주며 연결 기능은 문제가있는 기능입니다. QPushButton의 clicked() 신호에 다른 서명이 있기 때문에 QSpinBox의 setValue (int) 슬롯이 여기에서 작동하지 않습니다. 어쨌든 스핀 상자에 값 20을 어떻게 전달합니까? spinbox-> setValue (20)를 호출하는 슬롯 역할을하는 일종의 보조 함수를 작성해야합니까? 그렇다면 어떤 형태로 나타 납니까?

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    QWidget *window = new QWidget; 
    QSpinBox *spinbox = new QSpinBox; 
    QPushButton *button = new QPushButton("Set to 20"); 

    spinbox->setRange(0, 100); 

    // What should I put below? 
    QObject::connect(button, SIGNAL(clicked()), spinbox, SLOT(???????)); 

    QLayout *layout = new QHBoxLayout; 
    layout->addWidget(spinbox); 
    layout->addWidget(button); 
    window->setLayout(layout); 

    window->show(); 

    return app.exec(); 

} 
+1

설명서에는 필요한 모든 것이 있습니다. 이 문서로 시작하는 것이 좋습니다. http://doc.trolltech.com/4.5/signalsandslots.html – Anonymous

+0

거기에 아무 것도 알려주지 않습니다. – PowerApp101

+0

정말요? 신호 및 슬롯 메커니즘은 유형 안전합니다. 신호의 서명은 수신 슬롯의 서명과 일치해야합니다. 그리고 몇 가지 간단한 예가 귀하의 질문에 적용됩니다. – Anonymous

답변

3

는 당신도 할 수있다 : 그것은 특정는 QWidget에 대한 포인터를 위해 AuxSignals 클래스를 필요로하지 않기 때문에

class AuxSignals : public QObject 
{ 
    Q_OBJECT 
    ... 
    signals: 
     void valueChanged(int); 
    public slots: 
     void buttonClicked() { emit valueChanged(20); } 
}; 

... 

// On main.cpp 
AuxSignals *auxSignals = new AuxSignals; 

QObject::connect(button, SIGNAL(clicked()), auxSignal, SLOT(buttonClicked)); 
QObject::connect(auxSignals, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int))); 

또는

class AuxSignals : public QObject 
{ 
    Q_OBJECT 
    ... 
    QSpinBox *m_spinBox; 
    public: 
     AuxSignals(QSpinBox *spinBox) : m_spinBox(spinBox) {} 
    public slots: 
     void buttonClicked() { m_spinBox->setValue(20); } 
}; 

... 

// On main.cpp 
AuxSignals *auxSignals = new AuxSignals(spinBox); 

QObject::connect(button, SIGNAL(clicked()), auxSignals, SLOT(buttonClicked())); 

나는 첫 번째 옵션을 선호합니다.

+0

완벽한! 나는 단지 하나의 연결만을 사용하기 때문에 실제로 제 2 판을 선호한다. 작은 수정 - m_spinBox-> setValue (20) 여야합니다. 다시 한번 감사드립니다. – PowerApp101

+0

환영합니다. 고정 m_spinBox-> setValue (20); 교수. – Gaston

1

여기 사용자 정의 슬롯을보고 있습니다. QPushButton::clicked 신호는 부울 (true|false) 이벤트를 제공합니다. QSpinBox::setValue을 사용하여 잡으면 멀리 가지 않을 것입니다. QSpinBox::setValue은 int를 예상하며 대문자와 같이 입력 부울을 0 또는 1로 변환하며 스핀 상자는 1 단위 만 증가합니다. 사용자 정의 SLOT을 작성하는 경우 실제로는 더 정확한 제어를 통해 정확한 슬라이더 값을 설정할 수 있습니다.

+0

커스텀 슬롯을 정의하기 위해 Qt Designer를 사용할 필요가있는 것처럼 보입니다. 원시 코드에 더 간단한 방법이 있기를 바랬습니다. QSpinBox를 서브 클래스 화하고 setValue (20)를 수행하는 새로운 슬롯을 정의한다면 어떨까요? 그게 최선의 관행입니까? – PowerApp101

+0

래퍼 (서브 클래 싱/컴포지션)가 반드시 작동합니다. – dirkgently

관련 문제