信号函数和槽函数之间的关系
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,"提示","您没有选择颜色");
}
}