day45

信号函数和槽函数之间的关系
 

    1、信号函数和槽函数进行链接时,一般要求信号函数和槽函数的参数保持一致
        connect(信号发送者, SIGNAL(signalFun()),信号接收者, SLOT(slotFun()));     //Ok
        connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int)));     //Ok
        connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(int, char)));     //Ok
        connect(信号发送者, SIGNAL(signalFun(Qstring, int)),信号接收者, SLOT(slotFun(int, QString)));     //False
        connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(QString)));     //False
    2、当信号函数的参数大于槽函数的参数时
        connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun()));     //Ok
        connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(int)));     //Ok
        connect(信号发送者, SIGNAL(signalFun(int, QString)),信号接收者, SLOT(slotFun(QString)));     //False
    3、当信号函数的参数小于槽函数的参数时
        connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int, char)));     //False
        connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int, char=0)));     //Ok   可以使用qt4版本传,但是不支持了
 
 

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
 
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //将信号函数1和槽函数1进行绑定
    connect(this, &Widget::mySignal1, this, &Widget::mySlot1);
 
 
    //信号函数的参数大于槽函数的参数:信号函数传来的数据槽函数可以不接
    connect(this, &Widget::mySignal2, this, &Widget::mySlot1);
 
 
    //将带参信号与带参槽进行连接
    connect(this, &Widget::mySignal2, this, &Widget::mySlot2);
    //connect(this, &Widget::mySignal2, this, &Widget::mySlot3);
    //connect(this, SIGNAL(mySignal2(int)), this, SLOT(mySlot3(int, QString)));
 
 
    //将带参信号与带参槽连接
    connect(this, &Widget::mySignal3, this, &Widget::mySlot3);
}
 
 
Widget::~Widget()
{
    delete ui;
}
 
 
//槽函数1的定义
void Widget::mySlot1()
{
    qDebug() << "触发了槽函数1的相关功能";
}
//槽函数2的定义
void Widget::mySlot2(int num)
{
    qDebug()<<"您触发了槽函数2 num = "<<num;
}
//槽函数3的定义
void Widget::mySlot3(int num, QString str)
{
    qDebug()<<"您触发了槽函数3 num = "<<num<<"   str = "<<str;
}
 
 
//按钮1对应的槽函数
void Widget::on_btn1_clicked()
{
    //手动发射信号1
    //emit mySignal1();
    //手动发射信号2
    emit mySignal2(520);
    //手动发射信号3
    emit mySignal3(520, "1314");
}
 
 
 


信号与槽连接的总结


1>    一个信号可以连接到多个槽函数中
2>    多个信号可以连接到同一个槽函数中,当连接的任意一个信号被发射出来后,槽函数就立即执行
3>    一个信号函数也可以连接到另一个信号函数上,表示当前面的信号被发射 后,后面的信号紧跟着发射出去
 

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
 
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //将信号函数1和槽函数1进行绑定
    connect(this, &Widget::mySignal1, this, &Widget::mySlot1);
 
 
    //信号函数的参数大于槽函数的参数:信号函数传来的数据槽函数可以不接
    connect(this, &Widget::mySignal2, this, &Widget::mySlot1);
 
 
    //将带参信号与带参槽进行连接
    connect(this, &Widget::mySignal2, this, &Widget::mySlot2);
    //connect(this, &Widget::mySignal2, this, &Widget::mySlot3);
    //connect(this, SIGNAL(mySignal2(int)), this, SLOT(mySlot3(int, QString)));
 
 
    //将带参信号与带参槽连接
    connect(this, &Widget::mySignal3, this, &Widget::mySlot3);
 
 
    //将一个信号绑定到另一信号上
    connect(ui->btn1, &QPushButton::clicked, this, &Widget::mySignal1);
 
 
    connect(ui->btn1, &QPushButton::clicked, this, &Widget::mySlot1);
}
 
 
Widget::~Widget()
{
    delete ui;
}
 
 
//槽函数1的定义
void Widget::mySlot1()
{
    qDebug() << "触发了槽函数1的相关功能";
}
//槽函数2的定义
void Widget::mySlot2(int num)
{
    qDebug()<<"您触发了槽函数2 num = "<<num;
}
//槽函数3的定义
void Widget::mySlot3(int num, QString str)
{
    qDebug()<<"您触发了槽函数3 num = "<<num<<"   str = "<<str;
}
 
 
//按钮1对应的槽函数
void Widget::on_btn1_clicked()
{
    //手动发射信号1
    //emit mySignal1();
    //手动发射信号2
    //emit mySignal2(520);
    //手动发射信号3
    //emit mySignal3(520, "1314");
}
 
 
 


 信号与槽机制的简单应用--> 多个界面之间的跳转

1>    实现不同界面的跳转
1、ui界面1

ui界面2

2>    头文件
界面1头文件
 

#ifndef WIDGET_H
#define WIDGET_H
 
 
#include <QWidget>
 
 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
 
class Widget : public QWidget
{
    Q_OBJECT
 
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
 
signals:
    void jump();          //自定义跳转函数
 
 
private slots:
    void on_pushButton_clicked();
 
 
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
界面2头文件
 

#ifndef SECOND_H
#define SECOND_H
 
 
#include <QWidget>
 
 
namespace Ui {
class Second;
}
 
 
class Second : public QWidget
{
    Q_OBJECT
 
 
public:
    explicit Second(QWidget *parent = nullptr);
    ~Second();
 
 
public slots:
    void jump_slot();      //跳转信号对应的槽函数
 
 
private:
    Ui::Second *ui;
};
 
 
#endif // SECOND_H
3>    源文件
1、界面1源文件
 

#include "widget.h"
#include "ui_widget.h"
 
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
 
 
    //将按钮的信号与跳转信号连接
    //connect(ui->pushButton, &QPushButton::clicked, this, &Widget::jump);
 
 
}
 
 
Widget::~Widget()
{
    delete ui;
}
 
 
 
 
void Widget::on_pushButton_clicked()
{
    //发射自定义的信号
    emit jump();
 
 
    //将当前界面关闭
    this->close();
}
2、界面2源文件
 

#include "second.h"
#include "ui_second.h"
 
 
Second::Second(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Second)
{
    ui->setupUi(this);
}
 
 
Second::~Second()
{
    delete ui;
}
 
 
//接收跳转信号的槽函数的定义
void Second::jump_slot()
{
    this->show();          //显示当前界面
}
 
 
同一界面中多个组件的跳转

1>    头文件
 

#ifndef WIDGET_H
#define WIDGET_H
 
 
#include <QWidget>
 
 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
 
class Widget : public QWidget
{
    Q_OBJECT
 
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
 
signals:
    //提供跳转信号
    void jump();
 
 
private slots:
    void on_pushButton_clicked();
 
 
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
2>    源文件
 

#include "widget.h"
#include "ui_widget.h"
 
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
 
 
    //界面1中的fram1显示,但是fram2不显示
    ui->fram2->close();
 
 
    //将自定义的信号与槽连接
    connect(this, &Widget::jump, ui->fram2, &QFrame::show);
 
 
 
 
 
 
}
 
 
Widget::~Widget()
{
    delete ui;
}
 
 
//登录按钮对应的槽函数
void Widget::on_pushButton_clicked()
{
    //发送登录信号
    emit jump();
 
 
    ui->fram1->close();
}
 


加载资源文件

 

 

点下锤子,构建一下即可


发布软件


1>    配置环境变量
找到qt安装路径的bin目录

2>    打开系统环境变量

 


3>    以release的形式执行一下程序

 
4>    找到文件路径中以release形式发布软件的可执行程序,复制到一个新文件夹中


 


 
5>    在当前文件夹的空白处 shift + 右击   ----> 在此处打开 powershell窗口

 
 
对话框


Qt提供了多种用图形化界面的对话框,以便于提高程序的可操作性:同于信息交互的消息对话框、用于获取系统中颜色和字体的颜色对话框和字体对话框、关于文件操作的文件对话框、用于数据输入的输入对话框
 


1    消息对话框(QMessageBox)


消息对话框类提供了两套用于实现消息对话框的API,分别是基于属性版本和基于静态成员函数版本
1>    基于属性版本
1、使用类实例化对象(构造函数)
2、给对象设置相关属性:窗口名称、消息内容、提供的按钮
3、调用成员函数将对话框展示出来
 

QMessageBox::QMessageBox(                    //构造函数函数名
    QMessageBox::Icon icon,                 //图标
    const QString &title,                   //窗口标题
    const QString &text,                     //窗口文本内容
    QMessageBox::StandardButtons buttons = NoButton,     //提供的按钮
    QWidget *parent = nullptr)                //父组件
对参数1的解析:是一个该类提供的内部枚举类型
 
Constant                                 Value                         Description
QMessageBox::NoIcon                         0                     不提供图标.
QMessageBox::Question                       4                     提供一个问号的图标
QMessageBox::Information                    1                     提供一个 i 符号的图标
QMessageBox::Warning                        2                     提供一个感叹号的图标表示警告
QMessageBox::Critical                       3                     提供一个叉号图标表示错误.
   
对参数4的解析:是给对话框上提供的用于用户操作的按钮,也是一个枚举类型,如果需要提供多个按钮,中间使用位或隔开
 
Constant                         Value                     Description
QMessageBox::Ok                 0x00000400                 An "OK" button defined with the AcceptRole.
QMessageBox::Open               0x00002000                 An "Open" button defined with the AcceptRole.
QMessageBox::Save               0x00000800                 A "Save" button defined with the AcceptRole.
QMessageBox::Cancel             0x00400000                 A "Cancel" button defined with the RejectRole.
QMessageBox::Close              0x00200000                 A "Close" button defined with the RejectRole.
。。。
 
 
举个例子
  QMessageBox msgBox;
  msgBox.setText("The document has been modified.");
  msgBox.setInformativeText("Do you want to save your changes?");
  msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
  msgBox.setDefaultButton(QMessageBox::Save);
  int ret = msgBox.exec();
 
2>    基于静态成员函数版本
无需实例化对象,直接使用类名调用函数即可
系统提供4个静态成员函数:information、question、warning、critical
 

[static] QMessageBox::StandardButton                 //函数返回值类型,是一个静态成员函数,返回的是一个按钮
        QMessageBox::information(                   //函数名
            QWidget *parent,                         //父组件
            const QString &title,                    //对话框标题
            const QString &text,                      //对话框文本内容
            QMessageBox::StandardButtons buttons = Ok,    //提供的按钮
            QMessageBox::StandardButton defaultButton = NoButton)     //默认按钮
举个例子:
  int ret = QMessageBox::warning(this, tr("My Application"),
                                 tr("The document has been modified.\n"
                                    "Do you want to save your changes?"),
                                 QMessageBox::Save | QMessageBox::Discard
                                 | QMessageBox::Cancel,
                                 QMessageBox::Save);
 


2    消息对话框实例


1>    ui界面

2>    头文件
\

#ifndef WIDGET_H
#define WIDGET_H
 
 
#include <QWidget>
 
 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
 
class Widget : public QWidget
{
    Q_OBJECT
 
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
 
private slots:
    void on_warnIconBtn_clicked();
 
 
    void on_infoIconBtn_clicked();
 
 
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
3>    源文件
Plain Text
自动换行

#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>      //消息对话框类
#include<QDebug>
 
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}
 
 
Widget::~Widget()
{
    delete ui;
}
 
 
 
 
//警告按钮对应的槽函数
void Widget::on_warnIconBtn_clicked()
{
    //1、实例化对象
    QMessageBox box(QMessageBox::Warning,              //图标
                    "警告对话框",                       //对话框标题
                    "放学别走,等着哈",                  //对话框文本内容
                    QMessageBox::Ok|QMessageBox::No,    //提供的按钮
                    this);                              //父组件
 
 
    //2、可以对对话框进行属性设置
    box.setButtonText(QMessageBox::Ok, "没问题");
    box.setButtonText(QMessageBox::No, "怂了");
 
 
 
 
    //3、调用成员显示对话框
    int res = box.exec();
 
 
    //4、对用户按钮进行判断
    if(res == QMessageBox::Ok)
    {
        qDebug()<<"谁走谁小狗";
    }else if(res == QMessageBox::No)
    {
        qDebug()<<"你永远是我大哥,已老实,求放过";
    }
}
//信息按钮的槽函数
void Widget::on_infoIconBtn_clicked()
{
    //调用静态成员函数版本
    int res = QMessageBox::information(this,               //父组件
                             "信息",                         //对话框标题
                             "今晚老地方见",                   //对话框文本内容
                             QMessageBox::Yes|QMessageBox::No,   //提供的按钮
                             QMessageBox::Yes);               //默认选中的按钮
 
 
    //对用户点击的按钮进行判断
    if(res == QMessageBox::Yes)
    {
        qDebug()<<"不见不散,不醉不归";
    }else if(res == QMessageBox::No)
    {
        qDebug() << "不好意思,有约了,下次一定";
    }
}
 
 
 

 


3    颜色对话框(QColorDialog)、字体对话框(QFontDialog)、文件对话框(QFileDialog)


1>    这三个对话框,一般都是使用静态成员函数版本实现
2>    颜色对话框
 

[static] QColor                          //函数返回值类型,是一个颜色类对象
    QColorDialog::getColor(               //函数名
        const QColor &initial = Qt::white,      //打开对话框后的初始颜色
        QWidget *parent = nullptr,                //父组件
        const QString &title = QString())        //对话框标题
所需要的类:
QColor:颜色类
QColorDialog:颜色对话框类        
 
 
ui界面

头文件
 

#ifndef WIDGET_H
#define WIDGET_H
 
 
#include <QWidget>
 
 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
 
class Widget : public QWidget
{
    Q_OBJECT
 
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
 
private slots:
    void on_colorBtn_clicked();
 
 
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
源文件
 

#include "widget.h"
#include "ui_widget.h"
#include<QColor>           //颜色类
#include<QColorDialog>      //颜色对话框类
#include<QMessageBox>
 
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}
 
 
Widget::~Widget()
{
    delete ui;
}
 
 
 
 
//颜色按钮对应的槽函数
void Widget::on_colorBtn_clicked()
{
    QColor c = QColorDialog::getColor(QColor(255,0,0),            //静态成员函数,参数1为初始颜色
                           this,                        //父组件
                           "请选择颜色");                //对话框标题
 
 
    //对用户选中的颜色进行判断
    if(c.isValid())
    {
        //表示用户选中了颜色
        //将当前选中的颜色,放到文本编辑器上
        //ui->textEdit->setTextColor(c);        //设置字体 前景色
        ui->textEdit->setTextBackgroundColor(c);      //设置字体背景色
    }else
    {
        //表示用户没有选择颜色
        QMessageBox::information(this,"提示","您没有选择颜色");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值