【问题标题】:How to call a static function as a SLOT() in Qt? [duplicate]如何在 Qt 中将静态函数调用为 SLOT()? [复制]
【发布时间】:2013-05-31 14:18:25
【问题描述】:

我在 ROS 节点中使用 Qt 代码。我在课堂上声明了一个 static 函数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()));       
}

【问题讨论】:

  • 我会改写:你正在用什么版本的 Qt 编译?
  • 我正在使用 qt 4。我已经尝试过 QObject::connect(selectButton, SIGNAL(clicked()),this, SLOT(setLabel()))。但后来我得到一个错误“'this' is available for static member functions”
  • @NikosC.- 是的,我早些时候看到了那个帖子,但我真的不明白。就我而言,问题是我在 ROS 中使用 QT 代码,所以我无法使用“this”
  • 我尝试使用 QObject::connect(selectButton, SIGNAL(clicked()),STATIC_SLOT(setLabel()));但后来我收到错误“错误:‘STATIC_SLOT’未在此范围内声明”
  • 您对答案有什么不明白的地方?它给了你一个明确的答案:“不,这是不允许的。”。

标签: qt qt-creator


【解决方案1】:

你试试这个,

QObject::connect(selectButton, SIGNAL(clicked()), listenerObj, SLOT(setLabel()));

listenerObj 是您声明插槽的类的对象指针。如果您无法在侦听器中使用“this”,则声明一个包含函数 setLabel 的公共插槽的活动对象并连接该插槽。

在新类的头文件中声明 setLabel() 为公共槽

class SomeClass
{
public slots:
void setLabel();
}

然后使用父指针可以在界面中显示标签

我认为其中的一些内容会对您有所帮助。

【讨论】:

  • 谢谢。实际上目前我无法在星期一之前检查我的程序。但是请告诉我,当我不在 QT 项目中编写代码时,我可以在课堂上声明“公共插槽:”吗?我刚刚将 QT creator 的头文件包含在我的 ROS 节点的代码中。
  • 如果它包含使用宏继承的 QObject 基类,则可以。您只需引用一个使用 QtCreator 创建的类。
【解决方案2】:

首先,摆脱全局变量。你为什么需要它?全局变量变化很大,应该避免。
其次,将Q_OBJECT宏添加到myQtClass并执行qmake
第三,你的setLabel() 插槽不应该是private,如果你想在myQtClass 之外使用它,请设置为public

【讨论】:

  • 谢谢,我已经更新了上面的代码。它很好,但由于 Q_OBJECT 宏,我得到了错误。错误是“未定义对 `vtable for imageDisplay' 的引用”
  • @user2440724: 如果ImageDisplay 在.cpp 文件中而不是在单独的.h 文件中声明,那么您必须将以下内容添加到.cpp 文件的末尾以强制Qt 的moc在 .cpp 文件上运行 - 默认情况下它仅针对 .h 文件运行:#include "ImageDisplay.moc"(假设源文件名是 ImgeDisplay.cpp
  • 谢谢,我试过了,但现在我收到错误消息“没有这样的目录”,#include "myCppFileName.moc"
  • 你能把ImageDisplay类声明移动到.h文件吗?如果你不能,我会尝试谷歌搜索“qobject declaration .cpp”之类的东西,也许有一些关于它的指南。但是将类声明移动到它应该在的位置会更好、更容易。
  • @user2440724:我认为海绵宝宝的建议很好。但无论哪种情况,您都可能需要自己重新运行 qmake 以确保正确生成 moc 文件。老实说,我不记得这一步是否必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 2014-04-20
相关资源
最近更新 更多