如何正确使用 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 吗?
宏 SIGNAL
和 SLOT
基于名称的 文本 比较工作,因此对正确的限定很敏感。 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();
}
所以我想将我的 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 吗?
宏 SIGNAL
和 SLOT
基于名称的 文本 比较工作,因此对正确的限定很敏感。 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();
}