QObject :: connect: такого сигнала нет C ++ - PullRequest
0 голосов
/ 25 апреля 2020

Я застрял с ошибкой, и я понятия не имею, где я иду не так, я попытался запустить сигнал с помощью qapp aswell, просто чтобы убедиться, что это не сигнал, и это было хорошо. В моем заголовочном файле SLOT объявлен как слот publi c.

объявление сигнала:

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);
}

и это пустота в главном окне. cpp:

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

спасибо за вашу помощь заранее!

1 Ответ

2 голосов
/ 25 апреля 2020

Первое, что я бы сделал 1002 *, это очень внимательно посмотреть на несоответствие во втором параметре вашего совпадения сигнал / слот.

Один - QPolygon&, а другой - CustomPolygon*. Я понимаю, что они должны были соответствовать. Даже если один из них является подходящим подклассом другого, я не думаю, что вы можете смешивать ссылки и указатели подобным образом.


И в отношении вашего (слегка перефразированного) комментария:

Мой слот должен оставаться указателем, потому что он указывает на элемент, который удаляется из QGraphicsScene.

Мой сигнал не может быть указателем, поскольку нет преобразования из QPolygonF в QPolygonF *, и мне требуется от QPolygonF до mapToScene.

Я думаю Я понимаю, что вы говорите, и есть пара вопросов.

Если ваш слот принимает указатель, который будет освобожден, вы должны дать указатель на него и вернуть sh контроль над объектом позади него (так что начните с динамически выделяемой копии). вы хотите разрешить go из или сделать динамически распределяемой копией из того, что вы не хотите разрешить go из).

И я не уверен, почему вы думаете, что нет преобразования объекта в указатель на этот объект. Я полагаю, это технически верно, поскольку сам класс не обеспечивает преобразование, но это действительно часть языка base :

Type thing;
Type *pointerToThing = &thing;

Обе эти проблемы должны быть решены с помощью чего-то вроде:

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

Ваш сигнал все равно придется изменить, чтобы использовать указатель, а не ссылку, и, надеюсь, это уменьшит несоответствие.


Если указатель является фактическим указателем на QPolygonF, который не может быть скопирован (потому что это указатель на фактический элемент, содержащийся в QGraphicsScene, и поэтому вам нужен оригинальный указатель для его удаления), я думаю, вы должны просто иметь возможность передавать этот указатель как есть, предполагая, что mapToScene() возвращает ссылку на него, а не копию:

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