如何从qt正确使用信号/插槽系统

时间:2018-01-04 20:48:48

标签: c++ qt qt-signals slot

所以我想将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;
}

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

2 个答案:

答案 0 :(得分:2)

SIGNALSLOT基于文本名称比较而工作,因此对正确的资格认证很敏感。信号/插槽名称必须从不进行限定,并且任何类型必须与完全一致,与其声明中的相同。所以将代码更改为:

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

答案 1 :(得分:0)

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

chrome.runtime.onMessage.addListener(function(request) {
    if (request.type === 'urlDe') {
        alert(request.type + request.content);
    } else if (request.type === 'urlCom') {
        alert(request.type + request.content);
    }
});

希望这有帮助。

widget.h:

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

widget.cpp:

#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

main.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)));
}