2016-08-12 4 views
0

Qt로 약간의 운동을하고 있습니다. 알다시피, 슬롯 save_clicked은 매개 변수 유형 만 가져옵니다. 그렇다면 useridsave_clicked 슬롯 MyClass.cpp에 어떻게 처리 할 수 ​​있습니까? 사용하는 신호보다에서 MyClass.h생성자에서 슬롯으로 매개 변수를 전송하는 방법은 무엇입니까?

class MyClass : public QWidget 
{ 
    Q_OBJECT 

public: 
    MyClass(QString userid, QString lastname, QString firstname, QWidget *parent = 0); 
    ~MyClass(); 

public slots: 
    void save_clicked(QString userid); 

private: 
    Ui::MyClass ui; 
}; 

#endif // MYCLASS_H 

MyClass.cpp를

MyClass::MyClass(QString userid, QString lastname, QString firstname, QWidget *parent) 
: QWidget(parent) 
{ 
    ui.setupUi(this); 
    ........... 
    ........... 
    connect(ui.save, SIGNAL(clicked()), this, SLOT(save_clicked(QString))); 
} 

void MyClass::save_clicked(QString userid) 
{ 
    // process userid here  
} 
+0

당신은 단지 생성자에서 함수 호출을 사용할 수 있습니다. connec() 대신 save_clicked (userid)를 호출하십시오. – FreddyKay

+0

@FreddyKay : 클릭 이벤트를 처리하기 위해 OP를 수행해야하는 이유는 무엇입니까? – thokra

+2

OP : 어떤 버전의 Qt? qt5라면 http://doc.qt.io/qt-5/signalsandslots.html을 읽어보십시오.또한, 'MyClass'의 인스턴스가'userid'를 멤버로 저장했다면, 단순히'save_clicked'에서 사용할 수 있습니다. 슬롯에 아무 것도 "전송"할 필요가 없습니다. 또한, 왜'userid'는'QString'입니까? 정수 값이면 정수형을 사용하십시오. – thokra

답변

1

나은/슬롯은 변수를 사용한다. 그것은 클래스의 목표입니다.

private: 

QString userId; 

그리고 당신의 생성자 추가로 : 같은 것을 추가

MyClass::MyClass(QString userid, QString lastname, QString firstname, QWidget *parent) 
: QWidget(parent) 
{ 
    ui.setupUi(this); 
    this.userId=userid; 

} 

을이처럼 당신이 당신의 클래스로 원하는 위치에 원하는처럼 사용자 ID 사용할 수 있습니다.

편집 : 당신은 Qt는 창조주를 사용하는 경우 이러한 기능은 UI 디자인 인터페이스

에 자동으로 추가 할 수 있습니다

void MyClass::on_saveButton_clicked() 
{ 
    // you can use userId here 
} 

당신의 .H

private slots: 
    void on_saveButton_clicked(); 

에 당신의 .CPP에 추가

+0

-1. 이것은 문제의 해답이 아닙니다. 푸시 버튼의'clicked() '신호 처리가 제거되었으므로 OP가 의도 한 바가 아닙니다. – thokra

+0

아니요, 그의 문제는 * userid *를 자신의 기능에 전달하는 방법입니다. 이제 그는 간단한 button_clicked() 함수에서 변수를 사용할 수 있습니다. –

+0

죄송합니다. "완전히 읽지 못했습니다"라는 고전적인 예입니다. 실제로 "솔루션"은 제가 이미 코멘트에서 제안한 것입니다. 하지만 그 대답은 불완전하다고 생각합니다. – thokra

2

우선, 이미 제안이 있습니다 userid은 슬롯으로 전달할 필요가 없습니다. MyClass의 멤버로 선언하고 단순히 MyClass::save_clicked()에서 사용하면 문제가 없습니다.

신호가 제공하지 않는 슬롯에 인수를 전달해야하는 경우를 처리하는 방법을 알고 싶다면 여러 가지 방법이 있으며, 사용중인 Qt 버전에 따라 다릅니다. 상기로부터 다음 Qt5 docs 일반적

는 Qt5 및 QT4 동안 보유 : 신호의

서명이 수신 슬롯의 서명과 일치한다. (사실 슬롯은 여분의 인수를 무시할 수 있기 때문에 수신 신호보다 짧은 서명이있을 수 있습니다.)

사실, 당신은 신호를 제공 (또는하지 무엇을 사용 하나이 점을 감안 - 의존 당신이 그것을 필요로하는 경우에) 또는 다른 곳에 당신의 자료를 얻으십시오. A slot은 정규 함수 일뿐입니다 (Qt4에서는 좀 더 제한되어 있지만 Qt5에서는 기본적으로 을 신호에 호출 할 수있는에 연결할 수 있음).이 함수에서는 디자인에서 허용하는 모든 위치에서 필요한 데이터를 얻을 수 있습니다. 멤버 변수 접근법은 일반적이지만 다른 객체의 다른 멤버 함수를 호출하거나 자유 함수를 호출하거나 슬롯 내부에서 필요한 것을 계산할 수도 있습니다.

참고 : 신호를 처리하는 것은 반드시 당신이 어떤 데이터가 필요 의미하지 않는다 - 그것은 예, 흔한, 그러나 당신은 또한 일부 하드 코딩 된 텍스트와 QMessageBox을 제기하거나 텍스트 편집을 취소 간단하게 뭔가를 할 수 (Clear Console을 수행하는 버튼처럼 생각하십시오) 또는 외부 프로세스를 실행하거나 무엇이 있는지 확인하십시오. 모든 또는 신호가 매핑을 설정하는

  • 사용 QSignalMapper을 제공하는 기능의 일부를 사용

    • : 당신이 실제로 가 호출 될 때 데이터를받을 슬롯을해야하는 경우

      , 당신은 여러 가지 옵션이 있습니다 당신의 슬롯 인수에 대한 제한된 제어와 함께

    • 당신이 필요로하는 것을 저장하는 함수 객체를 사용하는 IMHO, 우수한 접근법을 사용하십시오. 즉, 직접적으로 또는 람다로서 제공하는 함수기 나 std::bind

    후자가 작동하려면 C++11 지원이 필요하지만 지금은 문제가되지 않아야합니다. 당신의 위의 예에서

    , 당신은 가장 기본적인 접근 방식이 뭔가를 할 수있다 (안된 - 내가 대답을 해결할 수 있도록 컴파일 오류 신고 해주세요) :

    MyClass::MyClass(QString userid, QString lastname, QString firstname, QWidget *parent) 
    : QWidget(parent) 
    { 
        ... 
    
        connect (
        ui.save, 
        &QPushButton::clicked, 
        std::bind (&MyClass::save_clicked, this, userid) 
    ); 
    
        ... 
    } 
    

    I에게 위의 경우를 때 clicked()ui.save가 방출된다 std::bind 의해 반환 된 함수 호출 랩퍼 수 차례의 MyClassthisMyClass::save_clicked 인스턴스를 호출하고 save_clicked()userid에 전달하는 호출한다.

    위는 기본적으로 처음에 달성하기를 원하는 것입니다. 그러나 이것은 빙산의 일각에 불과합니다. 이것으로 훨씬 더 나아갈 수 있으며, 예를 들어, 무엇이든을 바인딩하십시오.

    예를 들어 버튼을 통해 제공되는 다른 신호 (toggled(bool checked))에 연결했다고 가정합니다. 당신은 당신이 인스턴스 userid을 위해, 자신을 제공하는 많은 수의 인자를, 당신은 적절한 자리에 std::bind에 위의 호출을 확장 할 수 있습니다 부울로 체크 상태를 모두받을 수 원한다면 :

    connect (
        ui.save, 
        &QPushButton::toggled, 
        std::bind (&MyClass::save_clicked, this, _1, userid /*, ... more args here*/) 
    ); 
    

    을 당신은 것 지금 save_clicked() 위해 다음 특성이있다 :

    save_clicked(bool, QString); 
    

    toggled(bool)ui.save 방출에 의해 std::bind 의해 반환 된 함수 호출 랩퍼는 B와 호출을 MyClass::save_clicked_1 대신에 QString의 bool을 사용하면 std::bind의 네 번째 인수로 제공됩니다.

  • 관련 문제