【问题标题】:How to use QT signals and slots in QGIS C++ API如何在 QGIS C++ API 中使用 QT 信号和槽
【发布时间】:2019-07-30 12:13:13
【问题描述】:

我正在使用 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) 的类进行子类化以定义插槽?

【问题讨论】:

  • 似乎您没有使用 Qt 元对象编译 (MOC) 编译标头?如果不是这样,则可能缺少 Q_OBJECT 宏。
  • 我必须编译头文件吗? Qt 不会自动处理这个吗? Q_OBJECT 宏包含在头文件中。是一个普通的MainWindow 类。

标签: c++ qt qgis


【解决方案1】:

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

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

使用这个:

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

它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多