如何将信号连接到QWidget :: update插槽?

时间:2019-02-07 14:13:53

标签: qt

我正在使用具有新信号/插槽语法的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();
};

我在带有g ++的Arch Linux上使用QtCreator。

1 个答案:

答案 0 :(得分:0)

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通常是设计不良的迹象。

为满足您的好奇心,您可以使用lambda或qOverload来指定要连接的对象,以解决您所看到的错误,该错误是由方法指针类型的歧义引起的。以下任何一项均可使用:

connect(…, widget, qOverload<>(&QWidget::update));

auto constexpr update = qOverload<>(&QWidget::update));
connect(…, widget, update);

connect(…, widget, [widget]{ widget->update(); });