2013-12-10 3 views
0

QT4에서 생성 된 GUI가있는 오픈 소스 코드로 작업하고 있습니다. 내가하고 싶은 일은 GUI에서 버튼을 눌러야하는 순간에 코드를 약간 변경하는 것입니다. 내가 원하는 것은 함수를 호출하여 버튼을 눌러 실행할 필요가 없기 때문입니다.슬롯 인 Qt 함수를 호출하는 방법은 무엇입니까?

이 함수는 공개 슬롯 아래 tum_ardrone_gui 클래스에 정의되어 있습니다. 기능은 SendClicked()가 호출 그래서 나는 같은 객체를 정의하여 함수를 호출했다 :

tum_ardrone_gui* gui; 
gui->SendClicked(); 

나는 오류가 그러니 내 구문이 잘못 또는 내가 좋아하는 '슬롯'정의 함수를 호출 할 수 없습니다입니다 수 이?

미리 감사드립니다.

편집 1 : 모두에게 도움을 주셔서 감사합니다.

#include "../UINode/tum_ardrone_gui.h" 
#include "../UINode/RosThread.h" 
#include "../UINode/PingThread.h" 

#include <QtGui> 
#include <QApplication> 
#include "ros/ros.h" 

// this global var is used in getMS(ros::Time t) to convert to a consistent integer timestamp used internally pretty much everywhere. 
// kind of an artifact from Windows-Version, where only that was available/used. 
unsigned int ros_header_timestamp_base = 0; 

int main(int argc, char *argv[]) 
{ 
std::cout << "Starting drone_gui Node" << std::endl; 

// ROS 
ros::init(argc, argv, "drone_guiuno"); 
RosThread t; 
PingThread p; 

// UI 
QApplication a(argc, argv); 
tum_ardrone_gui w; 

// make them communicate with each other 
t.gui = &w; 
w.rosThread = &t; 
p.gui = &w; 
p.rosThread = &t; 
w.pingThread = &p; 

// start them. 
t.startSystem(); 
p.startSystem(); 
w.show(); 


// Error 1): 
//tum_ardrone_gui gui = new tum_ardrone_gui(); 
//gui->SendClicked(); 
//delete gui; 

// DOES NOT COMPILE: ERROR MESSAGE /usr/include/qt4/QtGui/qwidget.h: In copy constructor ‘tum_ardrone_gui::tum_ardrone_gui(const tum_ardrone_gui&)’: 
// /usr/include/qt4/QtGui/qwidget.h:806:5: error: ‘QWidget::QWidget(const QWidget&)’ is private 

//Error 2): Compiles and works! But why didn't the above? 
w.SendClicked(); 


// wait until windows closed.... 
int ec = a.exec(); 

// stop ROS again.... 
t.stopSystem(); 
p.stopSystem(); 

std::cout << "Exiting drone_gui Node" << std::endl; 

return ec; 
} 
+1

무엇을 얻고 있습니까? – khajvah

+2

@khajvah : Segfault, 아마도. 그는'tum_ardrone_gui' 객체를 만들지 않았습니다. –

+0

@VioletGiraffe 그래, 맞아. 내가 그것을 놓쳤다는 것을 믿을 수 없다 : D – khajvah

답변

1

여기서 가장 큰 문제는 만 tum_ardrone_gui에 대한 포인터로 gui을 선언하지만, 실제로 객체를 생성하지 않은 것입니다 : 여기에 내 MAIN.CPP 파일입니다. 대신, 당신은 같은 것을 수행해야합니다

tum_ardrone_gui gui = new tum_ardrone_gui(); 
gui->SendClicked(); 

을하지만 당신이 그것을 완료하면 gui을 삭제해야합니다. 예를 들어,이 코드는 위젯 내에 있는지 gui을 할당 할 때, 단순히

tum_ardrone_gui gui = new tum_ardrone_gui(this);

물품이 위젯 죽으면이어서,이를 해제한다.

귀하의 질문에 관해서는, C + + 관점에서 Qt 슬롯 그냥 일반적인 방법입니다, 그래서 그것을 메서드처럼 호출하십시오.

+0

답장을 보내 주셔서 감사합니다. 방금 실험 해 보았지만 '새로운'키워드를 사용해도 효과가없는 이유를 알고 싶습니다. 위의 질문을 편집하여 오류 메시지와 함께 main.cpp 파일을 포함시키고 주석 처리 한 내용과 작동 한 라이너를 주석으로 처리합니다. – Jay

관련 문제