如何在QGIS C API中使用QT信号和插槽

How to use QT signals and slots in QGIS C++ API

本文关键字:QT 信号 插槽 QGIS API      更新时间:2023-10-16

我正在使用QGIS 3.6 C API开发独立的QT 5.11.2应用程序。

我已经定义了一个插槽,该插槽旨在消耗currentLayerChanged(QgsMapLayer * layer)信号。

标题文件中的插槽声明为:

private slots:
    void on_CurrentLayer_changed(QgsMapLayer *layer);

插槽定义是:

void MainWindow::on_CurrentLayer_changed(QgsMapLayer *  layer)
{
    // do something here
}

当我尝试构建时,我会收到一个链接器错误:

moc_mainwindow.obj:-1: error: LNK2019: símbolo externo "public: static struct QMetaObject const QgsMapLayer::staticMetaObject" (?staticMetaObject@QgsMapLayer@@2UQMetaObject@@B) sin resolver al que se hace referencia en la función "int __cdecl qRegisterMetaType<class QgsMapLayer *>(char const *,class QgsMapLayer * *,enum QtPrivate::MetaTypeDefinedHelper<class QgsMapLayer *,1>::DefinedType)" (??$qRegisterMetaType@PEAVQgsMapLayer@@@@YAHPEBDPEAPEAVQgsMapLayer@@W4DefinedType@?$MetaTypeDefinedHelper@PEAVQgsMapLayer@@$00@QtPrivate@@@Z)
File not found: moc_mainwindow.obj
error: LNK1120: 1 externos sin resolver

我是否应该为发射信号currentLayerChanged(QgsMapLayer * layer)定义插槽的任何类子类吗?

我也有类似的问题。就我而言,我只使用另一个信号插槽结构。我的意思是而不是使用:

connect(sender,&className::signalName,receiver,slotName)

使用此:

connect(sender,SIGNAL(signalName),receiver,SLOT(slotName))

它对我有用。