簡體   English   中英

如何將信號連接到QWidget :: update插槽?

[英]How can I connect a signal to QWidget::update slot?

我正在將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。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM