QT入门-重载的信号槽

1)

signals:

       void sigSub();

       void sigSub(int, QString);

然后发送的时候可以发送多个信号。

emit sigSub(100, “lol”);

在写connect函数的时候:

connect(&sb, &SubWidget::sigSub, this, &Widget::slotShowMe);

connect(&sb, &SubWidget::sigSub, this, &Widget::slotSubMessage);

这样写会报错:槽函数和信号匹配不了。

因为在这里sigSub是函数名的地址,不知道参数有几个。重载之后编译器不知道去找哪一个函数了。

考虑函数指针,当定义函数指针时,就显式地定义了有几个参数。

void (SubWidget::*MySigSub)() = &SubWidget::sigSub; //自动找那个没有参数的 注意函数指针属于SubWidget类

    void (SubWidget::*MySigSubPlus)(int, QString) = &SubWidget::sigSub;//能够找到带参数的那个函数地址

    connect(&sb, MySigSub, this, &Widget::slotShowMe);

    connect(&sb, MySigSubPlus, this, &Widget::slotSubMessage);

2)注意slotSubMessage函数的输出要用QDebug类,qDebug() << a << ' '<< s;

如果打印出来的字符串是乱码,查看qDebug的参数为const char*,可能是参数不匹配(貌似QT 5.11已经没有这个问题了QAQ)。需要将QString转换为char*。

QString类有一个函数:toUtf8();

这样写即可:

qDebug() << a << ' '<< s.toUtf8().data();

注意:

    std::string ss;

    ss.c_str();

ss.data();//可以转化为char*

3)如果槽函数也重载了,还是需要定义一个函数指针。显式地声明槽函数的类型。注意别落下类名加作用域运算符。

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include "subwidget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void slotOpenSubWindow();
    void slotShowMe();
    void slotSubMessage(int, QString);
private:
    Ui::Widget *ui;
    QPushButton* b1;//显示子窗口
    SubWidget sb;//子窗口对象
};
#endif // WIDGET_H
//subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>

class SubWidget: public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = 0);
signals:
    void sigSub();
    void sigSub(int, QString);
public slots:
    void myslot();
private:
    QPushButton* b1;
};

#endif // SUBWIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    b1 = new QPushButton("点我点我", this);
    b1->resize(100, 50);
    b1->move(300, 300);
    connect(b1, &QPushButton::clicked, this, &Widget::slotOpenSubWindow);
    void (SubWidget::*MySigSub)() = &SubWidget::sigSub; //自动找那个没有参数的 注意函数指针属于SubWidget类
    void (SubWidget::*MySigSubPlus)(int, QString) = &SubWidget::sigSub;//能够找到带参数的那个函数地址
    connect(&sb, MySigSub, this, &Widget::slotShowMe);
    connect(&sb, MySigSubPlus, this, &Widget::slotSubMessage);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::slotOpenSubWindow()
{
    hide();
    sb.show();
}
void Widget::slotShowMe()
{
    show();
    sb.hide();
}
void Widget::slotSubMessage(int a, QString s)
{
    qDebug() << a << ' '<< s.toUtf8().data();
    std::string ss;
    ss.c_str();
    ss.data();//可以转化为char*
}
//subwidget.cpp
#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent): QWidget(parent)
{

    b1 = new QPushButton("我草泥马的线段树", this);
    b1 -> resize(200, 100);
    b1->move(150, 150);
    setWindowTitle("我叫线段树");
    resize(400, 600);
    connect(b1, &QPushButton::clicked, this, &SubWidget::myslot);
}
void SubWidget::myslot()
{
    //发送信号
    emit sigSub();
    emit sigSub(100, "傻逼树状数组");
}
//main.cpp
#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
原文地址:https://www.cnblogs.com/lipoicyclic/p/13269287.html