#include "subwidget.h" SubWidget::SubWidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("xiaodi"); b3.setText("切换到主窗口"); b3.setParent(this); b3.move(100,100); connect(&b3,&QPushButton::clicked,this,&SubWidget::sendslot); //resize(400,300); } void SubWidget::sendslot() { emit MySignal(); }
#ifndef SUBWIDGET_H#include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) { b1.setParent(this); b1.setText("shuaiTT"); b1.move(100,100); b2 = new QPushButton(this); b2->setText("pangRR"); b2->move(200,100); connect(&b1,&QPushButton::pressed,this,&Widget::close); // &b1:信号发出者 指针类型 // &QPushButton::pressed 处理的信号, &信号发出者的类名::信号类型 // this:信号接收者 // &Widget::close 槽函数,信号处理函数 /* 自定义槽 普通函数的用法*/ //QT:任意的成员函数,普通全局函数,静态函数 // 槽函数需要和信号一致 // 由于信号没有返回值 所以槽函数也没有返回值 connect(b2,&QPushButton::pressed,this,&Widget::my_slot); this->setWindowTitle("baba"); b3.setParent(this); b3.setText("切换待子窗口"); b3.move(150,200); // w2.show(); //显示子窗口 connect(&b3,&QPushButton::released,this,&Widget::changeWin); //从父窗口跳到子窗口 connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub);//从子窗口跳到父窗口 //resize(400,300); } void Widget::my_slot() { b2->setText("pangRR beauty..."); } void Widget::changeWin() { //子窗口显示,父窗口隐藏 w2.show(); this->hide(); } void Widget::dealsub() { //父窗口显示,子窗口隐藏 this->show(); w2.hide(); } Widget::~Widget() { }
#define SUBWIDGET_H#include <QWidget>#include <QPushButton>class SubWidget : public QWidget{
Q_OBJECTpublic:explicit SubWidget(QWidget *parent = 0);void sendslot();signals://信号必须有signals关键字//信号只有参数 没有返回值//信号就是函数的声明,只需要声明 不需要定义//使用方法 emit mysignal(); emit是关键字void MySignal();//void sendslot();public slots:private:QPushButton b3;};
#endif // SUBWIDGET_H
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>#include <QPushButton>#include "subwidget.h"class Widget : public QWidget{
Q_OBJECTpublic:Widget(QWidget *parent = 0);void my_slot();void changeWin();void dealsub();~Widget();private:QPushButton b1;QPushButton *b2;QPushButton b3;SubWidget w2;};
#endif // WIDGET_H
第二个部分,主要是两个窗口来回切换的实现
首先是从父窗口跳转到子窗口,新建一个窗口(右击项目 -> C++ class -> Base class:QWidget)并命名这个窗口
我们想要这个父窗口显示出子窗口 首先在这个父窗口里得有这个字窗口的变量,比如 SubWidget w2,并在文件开头添加 头文件 connect(&b3,&QPushButton::released,this,&Widget::changeWin);
这个语句里,b3是发出信号者,第二个参数是第一个控件的操作,第三个元素是收信号者,这里也就是this,最后一个参数 是我们自定义的一个槽函数,库函数里并没有我们需要的操作,而我们跳转过后,就需要父窗口关隐藏,子窗口show,所 以我们在这个类里面写这个函数的具体操作,比如w2.show() ; this->hide(); 注意点是每次写一个新的槽函数,一定要在 头文件中加上对他的声明,新定义的控件也是一样
其次反过来,从子窗口跳转到父窗口,这个难度要大一点
首先要解决的问题,在我们这个子窗口里,并没有父窗口的变量,(只能BOSS喊小弟出去买烟,没有小弟让BOSS出去买烟 的),那如何解决呢? 我们就用到了信号这个东西(signals),在我们刚刚提到的这个新创建的窗口的头文件里就有信号 这一栏,子窗口头文件信号里首先先定义一个 void MySignal() (信号注意事项看代码)发送一个信号就像广播一样。
connect(&b3,&QPushButton::clicked,this,&SubWidget::sendslot);
这个函数(在子窗口.cpp里)里 sendslot是用来发送信号的(emit)
connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub);//从子窗口跳到父窗口
这个函数(在父窗口.cpp里)是用来和子窗口相连接的,最后一个参数是用来处理这个信号的
(无论是哪个新的函数,都要在头文件里声明,很多次编译错误都是因为这个!!!)
其他的如果运行之后窗口大小一直在变,可以在每个.cpp里都加上这么一句话 resize(xxx,xxx);
吃饭睡觉学QT(3)- 信号与槽(2)
最新推荐文章于 2024-10-22 15:17:33 发布