[英]how can i connect a signal in one Qwidget to a slot in another Qwidget?
[英]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();
}
...
};
這就是您將如何使用它-注意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(); });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.