zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    3164 质因数分解
    codevs3249搭积木
    codevs 2964公共素数因数
    爱改名的小融1
    单链表基础练习
    并查集(union-find sets)
    string类中字符的大小写转换
    蒜头君学英语--set()练习
    打印锯齿矩阵
    堆积木
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/13269287.html
Copyright © 2011-2022 走看看