我正在使用具有新信号/插槽语法的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。
答案 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();
}
...
};
这就是您的使用方式-请注意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
通常是设计不良的迹象。
为满足您的好奇心,您可以使用lambda或qOverload
来指定要连接的对象,以解决您所看到的错误,该错误是由方法指针类型的歧义引起的。以下任何一项均可使用:
connect(…, widget, qOverload<>(&QWidget::update));
或
auto constexpr update = qOverload<>(&QWidget::update));
connect(…, widget, update);
或
connect(…, widget, [widget]{ widget->update(); });