2017-12-02 2 views
0

나는 display.cpp 클래스를 가지고 있는데, 게임을 시작해야하는 "start"라는 QToolButton을 가지고 있습니다. 또한 싱글 톤 controller.cpp 클래스가 있는데 display.cpp의 객체를 만들고 get은 QToolButton "start"의 포인터입니다. 그래서 지금 나는 "시작"버튼의 클릭 (부울) 신호를 내 custom SLOT에 controller.h에 연결하려고 시도했지만 어떤 이유로 작동하지 않는다.QToolButton 신호 및 슬롯 - QT

컴파일되고 실행됩니다.

두 클래스 모두 QObject와 Q_Object 매크로를 상속합니다.

display.cpp
//controller.h 
public slots: 
    void initGame(bool); 

//controller.cpp 
void Controller::initConnectors(){ 

    /*create object of Display.cpp*/ 
    Display *sender = new Display(); 

    /*getStartButton from display.cpp and connect it*/ 
    connect(sender->getStartButton(),SIGNAL(clicked(bool)), getControllersInstance() ,SLOT(initGame(bool))); 
} 

void Controller::initGame(bool a) 
{ 
    std::cout << "Received Signal?" <<std::endl; 
} 

:

/*Button that is used to start the game*/ 
QToolButton *Display::getStartButton() const 
{ 
return startButton; 
} 

그리고 MAIN.CPP에가 : "시작"누른 후

int main(int argc, char *argv[]) 
{ 
QApplication app(argc, argv); 
MainWindow m; 
Controller::Create(); 
Controller * controller = Controller::getControllerInstance(); 
controller->initConnectors(); 
m.show(); 
return app.exec(); 
} 

버튼, 아무 일도 발생하지 않습니다! display.cpp 클래스 자체에서 "시작"버튼을 테스트했는데 정상적으로 작동합니다. 하지만 controller.cpp에 버튼을 전달한 후에는 더 이상 작동하지 않습니다!

+0

표시 클래스. – eyllanesc

+0

최신 C++ 및 Qt의 최신 버전; 문자열 기반의 시그널/슬롯 함수와 관련'SIGNAL()'과'SLOT()'매크로를 사용하지 말 것을 권합니다. 대신 컴파일시 검사 된 포인터 - 구성원 함수 구문을 사용하십시오. 여기에는 몇 가지 장점이 있습니다. 오류는 런타임보다는 컴파일 타임에 플래그가 지정되므로 오류를 만들기가 더 어려워 더욱 효율적입니다. 또한; 많은 경우 컴파일을 완료 한 Q_OBJECT 매크로가 필요하지 않습니다. –

+0

우리가 당신을 도울 수 있기를 원하면 [mcve]를 제공해야하며, 현재 코드는 작동시키기 위해 추가 된 요소가 필요합니다. – eyllanesc

답변

1

슬롯을 int initGame(bool);으로 선언하지만 나중에 void initGame(bool)으로 정의하십시오.

여기가 문제의 근원이라고 생각합니다. 동일한 유형을 사용해야합니다. 그래도 문제가 해결되지 않으면 전체 코드를 확인해야합니다.

+0

죄송합니다! 그것은 내 부분의 오타였습니다! –