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();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM