2013-05-06 2 views
1

다음 코드에서 "누르기"버튼을 누르면 "원래 텍스트"가 "새 텍스트"로 바뀝니다. 나는 어떤 오류도 내지 않지만 레이블의 텍스트는 변하지 않는다. 여기QPushbutton이 연결되지 않습니다.

QPushButton *button=new QPushButton("click"); 

QLabel *label=new QLabel("original text"); 
QVBoxLayout *layout=new QVBoxLayout(); 
QString word("new text"); 
QWidget *window=new QWidget(); 

layout->addWidget(button); 
layout->addWidget(label); 
QPushButton :: connect(button,SIGNAL(clicked()),layout,SLOT(setText(word))); 
window->setLayout(layout); 
window->show(); 
+1

접근 방법이 잘못되었습니다. 설명서를 다시 읽으라고 제안합니다. 간단히 말해서, 연결 중에 '단어'와 같은 인스턴스를 지정할 수 없습니다. –

+0

대신 QPushButton :: connect (button, SIGNAL (클릭)()), 레이아웃, 슬롯 (setText ("new text"))); – g3nair

+0

도 작동하지 않았습니다! – g3nair

답변

3

주요 점 신호 및 슬롯 서명 호환되어야한다는 것이다. 즉, setText이 다른 서명을 가지고 있기 때문에 clicked() 신호를 슬롯 setText(QString const&)에 연결할 수 없습니다. 즉 QString const& 유형의 매개 변수를 허용하기 때문입니다.

은 당신이 할 수있는 것은 예를 들어,이 clicked() 신호에 연결 할 수 setText 있도록 사용자 정의 매개 변수가 슬롯을 정의하는 것 "전달" 클래스를 만드는 것입니다 :

class Forwarder: public QObject { 
    Q_OBJECT 

public: 
    Forwarder(QObject* parent = 0): QObject(parent), 
            word("new text"), 
            label(new QLabel("original text")) { 
    QPushButton* button = new QPushButton("click"); 
    QVBoxLayout* layout = new QVBoxLayout(); 
    QWidget*  window = new QWidget(); 

    connect(button, SIGNAL(clicked()), this, SLOT(setText())); 

    layout->addWidget(button); 
    layout->addWidget(label); 
    window->setLayout(layout); 
    window->show(); 
    } 

protected Q_SLOTS: 
    void 
    setText() 
    { label->setText(word); } 

private: 
    QLabel* label 
    QString word; 
}; 

참고하는 방법 사용자 정의 setTextclicked에 연결할 수 있으며 setText 호출을 label으로 전달합니다. 코드에서 잘못

두 더 많은 포인트 :

  • 당신은 같은 연결시 패스 인스턴스 수 없습니다 : 당신은 아마 의미

    ... 
    QString word("new text"); 
    ... 
    connect(button, SIGNAL(clicked()), layout, SLOT(setText(word))); // Odd! 
    ... 
    
  • label보다는 layout에 연결 . label의 텍스트를 변경하려면 이 아니라 label에 대해 setText 메서드를 호출해야합니다. 또한 layout (QLayout 클래스의 인스턴스에 대한 포인터로 사용)에는 setText 메소드가 없습니다.

필자는 위에 제시된 접근법이 왜 유효한지, 사용자가 아닌지를 고려하여 문서를 다시 읽으시기 바랍니다.

+0

감사합니다. 지금 당장 문서를 읽고 천천히 왜 코드가 작동하지 않는지에 대해 명확하게 알기 시작했습니다. 예, 저는 라벨을 사용하려고했습니다. 다시 한번 감사드립니다. – g3nair

관련 문제