QT 中的窗体切换
1.在QT中添加一个新的窗体文件# QT 中的窗体切换 1.在QT中添加一个新的窗体文件
2.选择新的主窗体
3.修改新窗体名称
4.实现两个窗体之间的跳转代码
1.新建一个窗体
w = new mywin(this); //记得传递this ,给子窗体,否则无法跳转回来
2.显示新窗体
w->show(); //
this->hide(); //hdie 隐藏
3.跳转回来
//在第二个窗体中,找到父亲窗体
this->parentWidget()->show();
//隐藏当前窗体
this->hide();
QT 的核心 信号与槽
什么是信号与槽??
一个对象发送一个信号出去,另外一个对象接收到该信号后,会触发相应的槽函数。
回顾的C 语言的信号
信号的注册:
NAME
signal - ANSI C signal handling
SYNOPSIS
#include <signal.h>
typedef void (*sighandler_t)(int); //int 触发该函数的信号值
sighandler_t signal(int signum, sighandler_t handler);
signum :需要注册的信号
handler :信号处理函数
--------------------
信号发送:
NAME
kill - send signal to a process
SYNOPSIS
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
C 语言中的信号可以让用户自定义的吗???
不能的,只能使用系统已经预定义好的一些信号
────────────────────────────────────────────────────────────────────────
SIGABRT P1990 Core Abort signal from abort(3)
SIGALRM P1990 Term Timer signal from alarm(2)
SIGBUS P2001 Core Bus error (bad memory access)
SIGCHLD P1990 Ign Child stopped or terminated
SIGCLD - Ign A synonym for SIGCHLD
SIGCONT P1990 Cont Continue if stopped
SIGEMT - Term Emulator trap
SIGFPE P1990 Core Floating-point exception
SIGHUP P1990 Term Hangup detected on controlling terminal
or death of controlling process
SIGILL P1990 Core Illegal Instruction
SIGINFO - A synonym for SIGPWR
SIGINT P1990 Term Interrupt from keyboard
--------------------------
C 语言的信号可以传递大量的数据吗????
不可以的。
所以QT 在C 的基础上对信号进行优化。 来实现QT 中的信号与槽,方便对象 与 对象之间的数据交互。
QT 中的信号与槽的定义语法:
connect(信号的发送者,SIGNAL(信号名称),信号的接收者,SLOT(槽函数));
//QT 4 的写法
connect(sender, SIGNAL(valueChanged(QString, QString)),receiver,
SLOT(updateValue(QString)));
//QT 5的写法
connect(信号的发送者,&信号所在的类名::信号名称,信号的接收者,&接收者的类名::槽函数);
connect(sender, &Sender::valueChanged,eceiver, &Receiver::updateValue);
信号与槽的定义
1.在需要接收信号的类中 声明槽函数
//声明槽函数
public slots:
void set_label();
2.在xxx.cpp 中实现槽函数
void MainWindow::set_label()
{
ui->label->setText("设置标签成功!!!666");
}
3.进行信号与槽的关联
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(set_label()));
用户自定义信号
1.去到信号的发送者类中声明信号
signals:
void mysig();
2.关联信号与槽
connect(this,SIGNAL(mysig()),this,SLOT(set_label()));
3.发送信号
emit mysig();
信号与槽的参数传递
1.定义一个带参的信号
signals:
//定义一个带参的信号
void mysig(int a);
2.定义一个带参数的槽
public slots:
void get_sig(int a);
3.进行信号与槽的关联
connect(this,SIGNAL(mysig(QString )),this,SLOT(get_sig(QString )));
或者QT5 写法
connect(this,&MainWindow::mysig,this,&MainWindow::get_sig);
4.发送带参数的信号
emit mysig("HELLO QT");
//练习: 发送一个带参的信号带 两个参数 int ,QSTRING 并把这两个数据 显示到 label 中
信号参数转递的注意事项:
1.信号与槽的参数类型必须要匹配
2.发送者的参数的个数 必须要大于或等于 接收者参数的个数
信号与槽的相互关联
信号与槽的取消关联
语法:
disconnect(信号的发送者,SIGNAL(发送的信号),信号的接收者,SLOT(接收的信号));
例子:
disconnect(this,SIGNAL(mysig()),this,SLOT(get_sig()));