如何正确使用 qt 中的 signal/slot 系统

How do I correctly use the signal/slot system from qt

所以我想将我的 QScrollArea 的高度和宽度发送到我的 QWidget(两者都是从这两个派生的自定义 类),但我就是无法正常工作。

customScrollArea *scrollArea;
RenderArea *scrollAreaWidgetContents;

void customScrollArea::resizeEvent(QResizeEvent* event)
{
   QScrollArea::resizeEvent(event);
   emit sizeChanged(width(),height());
}

MyGUI::MyGUI(QWidget *parent) :
    QWidget(parent),
ui(new Ui::MyGUI)
{
   ui->setupUi(this);
   connect(ui->scrollArea, SIGNAL(customScrollArea::sizeChanged(int,int)), ui->scrollAreaWidgetContents, SLOT(RenderArea::setSize(int,int)));
}

void RenderArea::setSize(int x, int y)
{
   scrollwidth = x;
   scrollheight = y;
}

当我编译时,我得到错误"QScrollArea::sizeChanged(int,int) in mygui.cpp:10" 但它不应该是 CustomScrollArea 而不是 QScrollArea 吗?

SIGNALSLOT 基于名称的 文本 比较工作,因此对正确的限定很敏感。 signal/slot 名称必须 never 限定,任何类型都必须 完全 限定,与它们在声明中的一样。因此,将您的代码更改为:

connect(ui->scrollArea, SIGNAL(sizeChanged(int,int)), ui->scrollAreaWidgetContents, SLOT(setSize(int,int)));

这里有一些例子。有 2 个 Widget:Widget 和 Widget2。 当调整 Widget w 的大小时,新的大小显示在 Widget2 w2 中。 在此示例中,这两个小部件的信号和插槽通过以下方式连接:

QObject::connect(&w, &Widget::resizeSignal,
                   &w2, &Widget2::onResizeSignal);

希望这对您有所帮助。

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
  Q_OBJECT
public:
  Widget(QWidget *parent = 0);
  ~Widget();

protected:
  void resizeEvent(QResizeEvent* e) override;

signals:
  void resizeSignal(int w, int h);

};

class Widget2 : public QWidget
{
  Q_OBJECT
public:
  Widget2(QWidget *parent = 0);
  ~Widget2();

public slots:
  void onResizeSignal(int w, int h);

protected:
  void paintEvent(QPaintEvent*) override;

private:
  int width = 0;
  int height = 0;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QPainter>
#include <QResizeEvent>

Widget::Widget(QWidget *parent)
  : QWidget(parent)
{}

Widget::~Widget()
{}

void Widget::resizeEvent(QResizeEvent* e)
{
    emit resizeSignal(e->size().width(), e->size().height());
    QWidget::resizeEvent(e);
}

Widget2::Widget2(QWidget *parent)
  : QWidget(parent)
{}


Widget2::~Widget2()
{}

void Widget2::onResizeSignal(int w, int h)
{
    width = w;
    height = h;
    repaint();
}


void Widget2::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    painter.setPen(QPen(Qt::red));
    painter.drawText(QPoint(50, 50),
                     QString("(w,h) = (%1, %2)").arg(QString::number(width), QString::number(height)));
}

main.cpp:

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  Widget w;
  Widget2 w2;

  QObject::connect(&w, &Widget::resizeSignal,
                   &w2, &Widget2::onResizeSignal);


  w.show();
  w2.show();

  return a.exec();
}