QObject :: connect:没有这样的信号错误C ++

时间:2020-04-24 22:00:11

标签: c++ qt signals slot

我陷入了一个错误,我不知道我哪里出错了,我也尝试使用qapp运行信号,只是为了确保它不是信号,这一切都很好。我在头文件中将SLOT声明为公共插槽。

信号声明:

void editPolygon(QVector <QPointF> points, QPolygonF &);

这是我的连接:

  connect(this, SIGNAL(editPolygon(QVector <QPointF> &, QPolygonF &)), parent, SLOT(editPolygon(QVector <QPointF> points, CustomPolygon *poly)));

这是我发出信号的插槽:

void CustomPolygon::editPolygons()
{
    QVector<QPointF> points;
    QPolygonF poly = mapToScene(polygon());

    emit editPolygon(points,poly);
}

这是mainwindow.cpp中的空白:

void MainWindow::editPolygon(QVector<QPointF> &points, CustomPolygon *poly)
{
}

感谢您的提前帮助!

1 个答案:

答案 0 :(得分:2)

我要做的第一事情是很难看清信号/插槽匹配的第二个参数的差异。

一个是QPolygon&,另一个是CustomPolygon*。我的理解是这些必须匹配。即使一个是另一个的适当子类,我也不认为您可以像这样混合使用引用和指针。


并且,关于您的(略作释义)评论:

我的广告位必须保留为指针,因为它指向从QGraphicsScene中删除的项目。

我的信号不能成为指针,因为没有从QPolygonFQPolygonF *的转换,并且我要求从QPolygonFmapToScene

思考我理解您的意思,并且有几个问题。

如果您的插槽使用了将要释放的指针,则必须给予一个指针,并放弃对其后面对象的控制(因此,您可以从动态分配的副本开始,放弃,或者制作从您不想不想放弃的东西中动态分配的副本。

我不确定为什么您会认为从对象到指向该对象的指针都没有转换。我想这在技术上是正确的,因为类本身不提供转换,但这实际上是 base 语言的一部分:

Type thing;
Type *pointerToThing = &thing;

这两个问题都可以通过以下方式解决:

QVector<QPointF> points;
QPolygonF thisIsMyPoly = mapToScene(polygon());
QploygonF *thisIsPolyForFreeing = new QPolygonF(thisIsMyPoly);
emit editPolygon(points, thisIsPolyForFreeing);

您的信号仍然必须更改为使用指针而不是引用,希望可以减轻不匹配的情况。


如果您的指针是无法复制的QPolygonF actual 指针(因为它是指向QGraphicsScene中保留的实际项目的指针,因此您需要删除它的原始指针),我认为您应该能够按原样传递该指针,并假设mapToScene()返回对其的引用而不是副本:

QPolygonF poly = mapToScene(polygon()); // get ref.
emit editPolygon(points, &poly);        // pass ref's address.