如何从QT中的静态函数发出信号?

问题描述 投票:0回答:3

我正在尝试将信号从静态成员函数发送到 QT 5 中同一成员的另一个槽。

在我的代码中,我必须调用一个静态 Gstreamer 函数,该函数是我作为 MainWindow 的成员创建的,以便它可以向其他 MainWindow 插槽发出信号。我的代码是这样的:

主窗口.cpp

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{


ui->setupUi(this);


connect(this, SIGNAL(emitSignal(int)), this, 
SLOT(signal_triggered(int)));

  GMainLoop *loop = NULL;
  gst_init (0, NULL);
  loop = g_main_loop_new (NULL, FALSE);
 ...........
...........

decoder_src_pad = gst_element_get_static_pad (decoder, "src");
  if (!decoder_src_pad)
    g_print ("Unable to get src pad\n");
  else
    gst_pad_add_probe (decoder_src_pad, GST_PAD_PROBE_TYPE_BUFFER,
        decoder_src_pad_buffer_probe, NULL, NULL);   // Must require 
Static function for CALLBACK

g_main_loop_run (loop);

}


GstPadProbeReturn decoder_src_pad_buffer_probe (GstPad * pad, 
GstPadProbeInfo * info, gpointer u_data)
{
GstBuffer *buf = (GstBuffer *) info->data;

int foo = 8;

emit emitSignal(foo); 

return GST_PAD_PROBE_OK;
}

void MainWindow::signal_triggered(int indx)
{

emit requestUpdate(indx); // Signal is connected to another class

}

主窗口.h

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
static GstPadProbeReturn decoder_src_pad_buffer_probe (GstPad * pad, 
GstPadProbeInfo * info, gpointer u_data);

public slots:
void signal_triggered(int);
signals:
void emitSignal(int index);
private:
Ui::MainWindow *ui;
.......
.......
}

但是QT编译器给出错误:

mainwindow.cpp:116: error: cannot call member function ‘void MainWindow::emitSignal(int)’ without object

我也尝试过

emit ui->emitSignal(foo);

但它也给出了错误:

error: invalid use of member ‘MainWindow::ui’ in static member function emit ui->emitSignal(foo);
c++ qt static signals gstreamer
3个回答
1
投票

静态函数无法访问非静态成员或函数(您没有

this
指针)。

因此,您不能(直接)从静态函数发出信号 - 哪个 QObject 应该是该信号的发射器(即您会

connect
到哪个 QObject?)

问问自己:“为什么我要尝试从静态函数发出信号?”并尝试发现并解决根本问题。从长远来看,你会避免很多头痛的事情。


1
投票

您可以使用单例模式。让你的班级像这样: 在此输入链接描述

并像这样使用emit:

    emit yourclassInstance->DataReady(samples);

0
投票

mainwindow.cpp:116:错误:无法在没有对象的情况下调用成员函数“void MainWindow::emitSignal(int)”

错误很明显。

事实上,信号(就像类的每个非静态成员/方法一样)依赖于类的活动实例。

static
方法不需要创建任何实例,因此不可能使用相关类的信号(如果您尝试访问相关类的非静态成员/方法,则采用相同的方式)。

如果您想发送此信号,则必须删除

static
说明符(这似乎不是您想要的),或者您可以将类实例的引用作为
static
函数的参数传递(并从 该实例发送所需的信号)。

© www.soinside.com 2019 - 2024. All rights reserved.