如何在Qt中将静态函数作为SLOT()调用?
我正在ROS节点中使用Qt代码。我在类中声明了一个静态函数如何在Qt中将静态函数作为SLOT()调用?,qt,qt-creator,Qt,Qt Creator,我正在ROS节点中使用Qt代码。我在类中声明了一个静态函数setLabel()。此函数的作用是将图像放入QLabel。现在,我想在使用信号/插槽连接单击按钮时调用此函数。请告诉我应该在问号的地方写些什么 class ImageDisplay: public QObject { Q_OBJECT public slots: void setLabel(); public: static void imageCallback( ); };
setLabel()
。此函数的作用是将图像放入QLabel。现在,我想在使用信号/插槽连接单击按钮时调用此函数。请告诉我应该在问号的地方写些什么
class ImageDisplay: public QObject
{
Q_OBJECT
public slots:
void setLabel();
public:
static void imageCallback( );
};
void ImageDisplay::setLabel()
{
QLabel* selectLabel= new QLabel();
selectLabel->setText("hi");
selectLabel->show();
}
void imageDisplay::imageCallBack()
{
ImageDisplay obj;
QObject::connect(selectButton, SIGNAL(clicked()),&obj, SLOT(setLabel()));
}
你试试这个
QObject::connect(selectButton, SIGNAL(clicked()), listenerObj, SLOT(setLabel()));
listenerObj是您声明插槽的类的对象指针。如果无法在侦听器中使用“this”,则声明一个活动对象,该对象包含函数setLabel的公共插槽,并连接该插槽
在新类的头文件中将setLabel()声明为公共插槽
class SomeClass
{
public slots:
void setLabel();
}
然后使用父指针可以在接口中显示标签
我想其中一些会对您有所帮助。首先,去掉全局变量。你为什么需要它?全局变量不正确,应避免使用。
其次,将
Q_对象
宏添加到myQtClass
并执行qmake
第三,您的
setLabel()
插槽不应该是private
,如果您想在myQtClass
之外使用它,请将其设置为public,我将重新表述:您使用的是什么版本的Qt?我使用的是qt4。我已经尝试过执行QObject::connect(选择按钮、信号(单击())、此、插槽(设置标签())。但是后来我得到一个错误“'this'对于静态成员函数不可用”@NikosC。-是的,我之前看过那篇文章,但我真的不明白。在我的例子中,问题是我在ROS中使用QT代码,所以我无法使用“this”,我尝试使用QObject::connect(selectButton,SIGNAL(clicked()),STATIC_SLOT(setLabel());但是我得到了一个错误“error:‘STATIC_SLOT’没有在这个范围内声明”关于这个答案你不明白什么?它给了你一个明确的答案:“不,这是不允许的。”。谢谢。实际上,目前我不能在星期一之前检查我的程序。但请告诉我,当我不在QT项目中编写代码时,我可以在类中声明“publicslots:”。我刚刚将QT creator的头文件包含在我的ROS节点的代码中。如果它包含用宏继承的QObject基类,则可以。您只需引用使用QtCreator创建的类。谢谢,我已经更新了上面的代码。这很好,但我得到的错误,因为Q_对象宏。错误为“'vtable for imageDisplay'”的未定义引用@user2440724:如果在.cpp文件中声明了imageDisplay
,而不是在单独的.h文件中,则必须在.cpp文件末尾添加以下内容,以强制在.cpp文件上运行Qt的moc-默认情况下,它仅针对.h文件运行:\include“ImageDisplay.moc”
(假设源文件名是ImgeDisplay.cpp
)谢谢,我试过了,但现在我得到一个错误,错误是“没有这样的目录”,包括“myCppFileName.moc”,你能把ImageDisplay
类声明移到.h
文件吗?如果不能,我会尝试用谷歌搜索类似的内容”qobject声明.cpp“,也许有一些关于它的指南。但将类声明移动到它应该位于的位置会更好、更容易。@user2440724:我认为SpongeBobFan的建议很好。但是在这两种情况下,您可能需要自己重新运行qmake
,以确保正确生成moc文件。老实说,我不记得这一步是否必要。