我陷入了一个错误,我不知道我哪里出错了,我也尝试使用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)
{
}
感谢您的提前帮助!
答案 0 :(得分:2)
我要做的第一事情是很难看清信号/插槽匹配的第二个参数的差异。
一个是QPolygon&
,另一个是CustomPolygon*
。我的理解是这些必须匹配。即使一个是另一个的适当子类,我也不认为您可以像这样混合使用引用和指针。
并且,关于您的(略作释义)评论:
我的广告位必须保留为指针,因为它指向从
QGraphicsScene
中删除的项目。我的信号不能成为指针,因为没有从
QPolygonF
到QPolygonF *
的转换,并且我要求从QPolygonF
到mapToScene
。
我思考我理解您的意思,并且有几个问题。
如果您的插槽使用了将要释放的指针,则必须给予一个指针,并放弃对其后面对象的控制(因此,您可以从动态分配的副本开始,放弃,或者制作从您不想不想放弃的东西中动态分配的副本。
我不确定为什么您会认为从对象到指向该对象的指针都没有转换。我想这在技术上是正确的,因为类本身不提供转换,但这实际上是 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.