QT 中的窗体切换

153 阅读3分钟

QT 中的窗体切换

c++的信号与槽.jpg

QT核心信号与槽.png

1.在QT中添加一个新的窗体文件# QT 中的窗体切换 1.在QT中添加一个新的窗体文件

image-20210712095808328.png

2.选择新的主窗体

image-20210712095929204.png

3.修改新窗体名称

image-20210712100028115.png

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.发送者的参数的个数   必须要大于或等于 接收者参数的个数

信号与槽的相互关联

image-20210712160956264.png

信号与槽的取消关联

语法:

disconnect(信号的发送者,SIGNAL(发送的信号),信号的接收者,SLOT(接收的信号));  
​
例子: 
disconnect(this,SIGNAL(mysig()),this,SLOT(get_sig()));
​

作业:制作一个登录界面,添加注册功能

image-20210712172722978.png