우선, 이미 제안이 있습니다 userid
은 슬롯으로 전달할 필요가 없습니다. MyClass
의 멤버로 선언하고 단순히 MyClass::save_clicked()
에서 사용하면 문제가 없습니다.
신호가 제공하지 않는 슬롯에 인수를 전달해야하는 경우를 처리하는 방법을 알고 싶다면 여러 가지 방법이 있으며, 사용중인 Qt 버전에 따라 다릅니다. 상기로부터 다음 Qt5 docs 일반적
는 Qt5 및 QT4 동안 보유 : 신호의
서명이 수신 슬롯의 서명과 일치한다. (사실 슬롯은 여분의 인수를 무시할 수 있기 때문에 수신 신호보다 짧은 서명이있을 수 있습니다.)
사실, 당신은 신호를 제공 (또는하지 무엇을 사용 하나이 점을 감안 - 의존 당신이 그것을 필요로하는 경우에) 또는 다른 곳에 당신의 자료를 얻으십시오. A slot
은 정규 함수 일뿐입니다 (Qt4에서는 좀 더 제한되어 있지만 Qt5에서는 기본적으로 을 신호에 호출 할 수있는에 연결할 수 있음).이 함수에서는 디자인에서 허용하는 모든 위치에서 필요한 데이터를 얻을 수 있습니다. 멤버 변수 접근법은 일반적이지만 다른 객체의 다른 멤버 함수를 호출하거나 자유 함수를 호출하거나 슬롯 내부에서 필요한 것을 계산할 수도 있습니다.
참고 : 신호를 처리하는 것은 반드시 당신이 어떤 데이터가 필요 의미하지 않는다 - 그것은 예, 흔한, 그러나 당신은 또한 일부 하드 코딩 된 텍스트와 QMessageBox
을 제기하거나 텍스트 편집을 취소 간단하게 뭔가를 할 수 (Clear Console
을 수행하는 버튼처럼 생각하십시오) 또는 외부 프로세스를 실행하거나 무엇이 있는지 확인하십시오. 모든 또는 신호가 매핑을 설정하는
사용 QSignalMapper을 제공하는 기능의 일부를 사용
후자가 작동하려면 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
의해 반환 된 함수 호출 랩퍼 수 차례의 MyClass
this
MyClass::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
의 네 번째 인수로 제공됩니다.
당신은 단지 생성자에서 함수 호출을 사용할 수 있습니다. connec() 대신 save_clicked (userid)를 호출하십시오. – FreddyKay
@FreddyKay : 클릭 이벤트를 처리하기 위해 OP를 수행해야하는 이유는 무엇입니까? – thokra
OP : 어떤 버전의 Qt? qt5라면 http://doc.qt.io/qt-5/signalsandslots.html을 읽어보십시오.또한, 'MyClass'의 인스턴스가'userid'를 멤버로 저장했다면, 단순히'save_clicked'에서 사용할 수 있습니다. 슬롯에 아무 것도 "전송"할 필요가 없습니다. 또한, 왜'userid'는'QString'입니까? 정수 값이면 정수형을 사용하십시오. – thokra