Вопрос по connect, slot, signals, qt, qobject – как передать qobject в качестве аргумента из сигнала в слот в qt connect

6

Мой оригинальный код передал QStringList из сигнала в слот, а затем возвратил QList. Все работало нормально, но мне нужно было изменить и QStringList, и QList на 2 разных подкласса QObject. С тех пор я получаю ошибки типа "синтезированный метод сначала требуется здесь или он просто падает без какого-либо сообщения об ошибке.

Я понимаю, что qt копирует все аргументы, переданные в очереди, и qobject не может быть скопирован. Поэтому вместо того, чтобы возвращать объект qobject, я подумал, что создам оба объекта qobject до передачи сигнала. Затем я передаю ссылки на каждый объект, изменяю один из них в функции slot и аннулирую возвращаемое значение. К сожалению, приложение все еще не работает, независимо от того, как я кодирую функции сигнала и слота. Как я могу закодировать функции сигнала / слота и соединить их, чтобы передать оба объекта qobject в качестве аргументов или вернуть объект qobject?

MyQObject1 obj1("a","b","c");
MyQObject2 obj2();
emit sendSignal(&obj1, &obj2);
// or
MyQObject2 obj2 = emit sendSignal(&obj1);

connect(someObj, SIGNAL(sendSignal(const QObject&)), this, SLOT(receiveSignal(const QObject&)));

Функция receiveSignal () не создает и не изменяет напрямую qobject. Он должен сначала передать объекты qobjects другой функции, которая затем либо модифицирует obj2, либо создает и возвращает ее. Любые примеры кода будут с благодарностью.

Ваш Ответ

1   ответ
11

ОбычноQObject передается по указателю, а не по ссылке (обратите внимание, чтоQObject не может быть скопировано и не может быть передано по значению).QObject* по умолчанию зарегистрирован как метатип. Таким образом, создавая сигнал и слот сQObject* аргументов достаточно, чтобы заставить их работать:

private slots:
  void test_slot(QObject* object);

signals:
  void test_signal(QObject* object);

Инициализация:

connect(this, SIGNAL(test_signal(QObject*)), this, SLOT(test_slot(QObject*)));

излучающие:

QObject* object = new QObject();
emit test_signal(object);

Конечно, сигнал и слот могут быть в разных классах.

Метатип: Я знаю, что это не моя точка зрения. Вы сказали, чтоQObject* зарегистрирован как метатип, и, таким образом, его можно использовать в сигнале / слоте. Это'не обязательно, хотя; если это так, передавая аргументMyObjectSubclass* уже не получится без регистрацииMyObjectSubclass* также. Frank Osterfeld
Если ты'Если вы используете соединение в очереди, и получатели могут пережить отправителя, тогда он можетУдалить объекты тоже. Таким образом, управление объектами с помощью общего указателя и передачи QSharedPointer <MyQObjectSubclass> может быть лучшим выходом в некоторых случаях. Или просто неt использовать сигнал / слоты для решения этой проблемы, здесь выглядит неправильно. Frank Osterfeld
Согласен. Это'Трудно использовать этот подход с очередями соединений. Однако это может быть полезно при прямом подключении. Pavel Strakhov
Ты нене нужна регистрация метатипа для сигналов / слотов, если соединение неочередь, И с подключениями в очереди я вижу проблемы с владениемobject, Кто владеет им и удалит его снова? Эмитент? Когда? Frank Osterfeld

Похожие вопросы