我正在尝试将信号从静态成员函数发送到 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);
静态函数无法访问非静态成员或函数(您没有
this
指针)。
因此,您不能(直接)从静态函数发出信号 - 哪个 QObject 应该是该信号的发射器(即您会
connect
到哪个 QObject?)
问问自己:“为什么我要尝试从静态函数发出信号?”并尝试发现并解决根本问题。从长远来看,你会避免很多头痛的事情。
mainwindow.cpp:116:错误:无法在没有对象的情况下调用成员函数“void MainWindow::emitSignal(int)”
错误很明显。
事实上,信号(就像类的每个非静态成员/方法一样)依赖于类的活动实例。
static
方法不需要创建任何实例,因此不可能使用相关类的信号(如果您尝试访问相关类的非静态成员/方法,则采用相同的方式)。
如果您想发送此信号,则必须删除
static
说明符(这似乎不是您想要的),或者您可以将类实例的引用作为 static
函数的参数传递(并从 和 该实例发送所需的信号)。