Qt-信号和槽-多对多

Posted chendeqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt-信号和槽-多对多相关的知识,希望对你有一定的参考价值。

前言:介绍1对多,多对1以及多对多的案例。

一、1对多

演示内容:在QLineEdit输入时,同步label,text browser以及调试输出板同步显示。

1.1 新建工程

1.2 添加部件

拖入line Edit、Label和Text Browser标签

技术分享图片

1.3 修改文件

修改 widget.h 头文件

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:   //添加槽函数打印调试信息
    void PrintText(const QString& text);

private:
    Ui::Widget *ui;
};

修改 widget.cpp 文件

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>  //qDebug函数需要的头文件

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->lineEdit, SIGNAL(textEdited(QString)), ui->label, SLOT(setText(QString)));//将 lineEdit 的编辑信号关联到 label 的设置文本槽函数;
    connect(ui->lineEdit, SIGNAL(textEdited(QString)), ui->textBrowser, SLOT(setText(QString)));//将 lineEdit 的编辑信号关联到 textBrowser 的设置文本槽函数
    connect(ui->lineEdit, SIGNAL(textEdited(QString)), this, SLOT(PrintText(QString)));//将 lineEdit 的编辑信号关联到主窗体的 PrintText 槽函数
}

Widget::~Widget()
{
    delete ui;
}

void Widget::PrintText(const QString &text)
{
    qDebug()<<text; //打印到调试输出面板
}

1.4 运行

技术分享图片

二、多对1 

演示内容:三个信号对应一个槽。

2.1 新建项目

2.2 新建部件

拖入三个button,并将ObjectName分别修改为pushButtonA,pushButtonB和pushButtonC。

 技术分享图片

2.3 修改文件

在widget.h中添加槽声明

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:   //添加槽函数进行弹窗
    void FoodIsComing();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

修改 widget.cpp 文件

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //三个按钮的信号都关联到 FoodIsComing 槽函数
    connect(ui->pushButtonA, SIGNAL(clicked()), this, SLOT(FoodIsComing()));
    connect(ui->pushButtonB, SIGNAL(clicked()), this, SLOT(FoodIsComing()));
    connect(ui->pushButtonC, SIGNAL(clicked()), this, SLOT(FoodIsComing()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::FoodIsComing()
{
    //获取信号源头对象的名称
    QString strObjectSrc = this->sender()->objectName();
    qDebug()<<strObjectSrc; //打印源头对象名称

    //将要显示的消息
    QString strMsg;
    //判断是哪个按钮发的信号
    if( "pushButtonA" == strObjectSrc )
    {
        strMsg = tr("Hello Anderson! Your food is coming!");
    }
    else if( "pushButtonB" == strObjectSrc )
    {
        strMsg = tr("Hello Bruce! Your food is coming!");
    }
    else if( "pushButtonC" == strObjectSrc )
    {
        strMsg = tr("Hello Castiel! Your food is coming!");
    }
    else
    {
        //do nothing
        return;
    }
    //显示送餐消息
    QMessageBox::information(this,tr("Food"),strMsg);
}

2.4 运行

技术分享图片

 

-END-

参考自:https://qtguide.ustclug.org/

以上是关于Qt-信号和槽-多对多的主要内容,如果未能解决你的问题,请参考以下文章

初见QT---信号和槽

Qt信号和槽的问题

QT信号和槽

qt信号和槽机制的问题

Qt 信号和槽

Qt5跨线程信号和槽