TL; DR: конвейер должен сигнализировать об изображении, а виджет должен иметь метод SetImage
:
class Pipeline : public QObject {
Q_OBJECT // important
public:
Q_SIGNAL void NewFrame(const QImage &);
...
};
class Viewer : public QWidget {
Q_OBJECT // important
QImage m_image;
public:
Q_SLOT void SetImage(const QImage &image) {
m_image = image;
update();
}
...
};
Вот как вы его будете использовать - обратите внимание, что Viewer
Pipeline
ничего не знает, потому что не должен: он просто показывает новые кадры, откуда бы они ни исходили.
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Pipeline pipeline;
Viewer viewer;
QObject::connect(&pipeline, &Pipeline::NewFrame, &viewer, &Viewer::SetImage);
return app.exec();
}
Подключение чего-либо непосредственно к QWidget::update
, особенно из внешних источников, обычно является признакомплохого дизайна.
Чтобы удовлетворить свое любопытство, вы можете использовать лямбду или qOverload
, чтобы указать, к чему вы подключаетесь, чтобы исправить ту самую ошибку, которую вы видите - вызваннуюпо неоднозначности типа указателя метода.Будет работать любое из следующего:
connect(…, widget, qOverload<>(&QWidget::update));
или
auto constexpr update = qOverload<>(&QWidget::update));
connect(…, widget, update);
или
connect(…, widget, [widget]{ widget->update(); });