c++ - 如何调用作为槽的qt函数?

标签 c++ qt ros

<分区>

我正在使用具有 QT4 生成的 GUI 的开源代码。我想要做的是稍微更改代码,此时它需要在 GUI 上按下一个按钮。我想要的是要调用的函数,这样我就不必按按钮来执行它。

该函数定义在public slots下的类tum_ardrone_gui中。该函数称为 SendClicked(),因此我通过定义一个对象来调用该函数,例如:

tum_ardrone_gui* gui;
gui->SendClicked();

我收到一个错误,是我的语法错误还是不允许我像这样调用“插槽”定义的函数?

提前致谢!

编辑 1:感谢大家的帮助。这是我的 main.cpp 文件:

#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;
}

最佳答案

这里的主要问题是您只将 gui 声明为指向 tum_ardrone_gui 的指针,但实际上并没有创建对象。相反,您应该这样做:

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

但是一定要在完成后删除gui。例如,如果此代码位于小部件内,只需编写

tum_ardrone_gui gui = new tum_ardrone_gui(this);

当分配 gui 时,它会在这个小部件死亡时被释放。

至于您的问题,从 C++ 的角度来看,Qt 插槽只是一种常规方法,因此可以像方法一样调用它。

关于c++ - 如何调用作为槽的qt函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20501782/

相关文章:

c++ - 如何为 mac el capitan 安装 qt4?

c++ - ROS 订阅者回调丢失消息

matlab - ROS 视频回调工作时 CTRL + C 不起作用

ros - 如何从 ROS 中的 catkin 工作区生成 .deb

c++ - Direct3D9 游戏 : Spaceship camera

c++ - 巨大的 vector "hangs"程序? (50000 x 50000 个细胞)

C++ 视频游戏编程 IDE

c++ - 类的友元函数产生错误 : "no ' __ _' member function declared"

c++ - 如何在 C++/Qt 中设置 30fps 循环

c++ - Qt 将字符串转换为 16 进制的 int 但保留 16 进制的值