如何在Qt中将静态函数作为SLOT()调用?

如何在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( ); };

我正在ROS节点中使用Qt代码。我在类中声明了一个静态函数
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文件。老实说,我不记得这一步是否必要。