如何在静态方法中将信号连接到插槽

How do I connect a signal to a slot in a static method?

本文关键字:信号 连接 插槽 静态方法      更新时间:2023-10-16

我正在尝试从静态方法中显示一个弹出窗口:

 void MainThread::popup(void){
 static klassePopup* roiPopup;
 roiPopup = new SavingROI();
 roiPopup->show();}

这段代码工作得很好,我得到我的窗口与两个qpushbutton,但我不明白当我应该连接信号clicked()与插槽。

下面的代码不起作用:

 connect(roiPopup->getsaveROIButton(),SIGNAL(clicked()),this,SLOT(saveROI(cv::Mat)));

我知道这个问题不是很清楚,但是这里的代码复制起来有点复杂

让我们仔细看看您的连接:

connect( roiPopup->getsaveROIButton(), SIGNAL( clicked(         ) ),
         this                        , SLOT  ( saveROI( cv::Mat ) ) );

我有意重新格式化它,以显示一些东西:

  1. 您正在尝试将没有参数的clicked连接到需要参数的插槽saveROI。这不起作用,因为连接不知道从哪里获得cv::Mat的值。
    相反,您需要创建一个不检索参数的槽。
  2. 正如ahenderson在评论中已经指出的那样,您不能在静态方法中使用this

主要问题是,为什么需要静态方法?因为你只想要一个单一的弹出窗口?如果这是唯一的原因,您通常会这样做:

MainThread.h:

class klassePopup;  // Note: This is a "forward declaration". 
                    //       Google it if you don't know what that is.
class MainThread : public QObject // or anything else which inherits QObject
{
public:
    MainThread();
    ~MainThread();
public:
    void popup(); // not static
private slots:
    saveROI(); // no parameter
private:
    klassePopup* _roiPopup;
};

MainThread.cpp:

#include "klassePopup.h"
#include "SavingROI.h"
MainThread::MainThread() :
   _roiPopup( new SavingROI() )
{
    bool bConnectionSucceeded
        = connect( _roiPopup->getsaveROIButton(), SIGNAL( clicked() ),
                 ( this                         , SLOT  ( saveROI() ) );
}
MainThread::~MainThread()
{
    delete _roiPopup;
}
void MainThread::popup()
{
    _roiPopup.show();
}
void MainThread::saveROI()
{
    // retrieve your cv::mat parameter from somewhere else
}

这个解决方案可以工作,但是如果你想从静态方法调用它,你必须在静态方法中创建你的主线程实例