Как я могу подключить сигнал к слоту QWidget :: update? - PullRequest
0 голосов
/ 07 февраля 2019

Я использую Qt5 с новым синтаксисом сигнал / слот.
Я не знаю, почему не работает следующий код:

QWidget *widget = new QWidget();
connect(pipeline, &Pipeline::NewFrame, widget, &QWidget::update);

Я получаю ошибку: no matching member function for call to 'connect' почему?

Класс конвейера наследуется от сигнала QObject и NewFrame и имеет ту же сигнатуру, что и QWidget :: update

class Pipeline
  : public QObject
{
    Q_OBJECT
    Q_DISABLE_COPY(Pipeline)
public:
    Pipeline(QObject *parent);

signals:
    void NewFrame();
};

Я использую QtCreator на Arch Linux с g ++.

1 Ответ

0 голосов
/ 07 февраля 2019

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

Вот как вы его будете использовать - обратите внимание, что ViewerPipeline ничего не знает, потому что не должен: он просто показывает новые кадры, откуда бы они ни исходили.

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(); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...