1:写一个close按钮当单击此按钮时就执行槽函数,而关闭窗口.
1 #include "slot.h" 2 #include <QApplication> 3 #include<QPushButton> 4 #include<time.h> 5 #ifndef SLOT_H 6 #define SLOT_H 7 #include <QMainWindow> 8 #include <QObject> 9 #include <QWidget> 10 class Slot : public QWidget 11 { 12 Q_OBJECT 13 public: 14 explicit Slot(QWidget *parent = nullptr); 15 Slot(const Slot &); 16 Slot &operator=(const Slot &); 17 ~Slot(); 19 signals: 21 public slots: 23 private: 24 QSharedDataPointer<SlotData> data; 25 }; 26 class SlotData : public QSharedData 27 { 28 public: 30 }; 31 Slot::Slot(QWidget *parent) : QWidget(parent), data(new SlotData) //Slot的构造函数. 32 { 33 QPushButton *btn = new QPushButton; //new关键字是c++动态分配那一节讲的。 34 btn->setParent(this); //this代表QWidget对象. 35 btn->setText("close"); 36 QPushButton *btn1; 37 connect(btn,&QPushButton::pressed,this,&Slot::close); 38 /* 39 * btn:btn是信号的发出者,作为connect()的第一个参数,该参数为发出者的地址,btn是指针类型所以btn是地址信息。 40 * &QPushButton::pressed: 指明btn在遇到用户给的presses的信号时才给this(Slot类的对象)发出信号让this执行槽函数。 41 * this: 信号的承受者也就是被执行者。 42 * close:为槽函数, 43 */ 44 /* 45 * 自定义信号和槽,普通函数的用法 46 * Qt:任意的成员函数,普通全局函数,静态函数. 47 * 槽函数需要和信号一致(参数,返回值) 48 * 由于信号都是没有返回值,使用槽函数一定没有返回值. 49 * 50 */ 51 } 52 Slot::~Slot() //Slot的析构函数. 53 { 55 }
2:自定义信号实现主窗口与子窗口的来回切换:
//基本原理:在主窗口类中定义子窗口对象,这样就可以指使子窗口干事了,子窗口发送一个自定义的信号主窗口,主窗口就处理信号。
# main.cpp:
1 #include "widget.h" 3 #include <QApplication> 5 int main(int argc, char *argv[]) 6 { 7 QApplication a(argc, argv); //查找QApplication()的相关资料 8 9 10 Widget w; //创建widget.cpp对象 11 w.setWindowTitle("父窗口"); 12 w.show(); 13 14 return a.exec(); 15 }
# mywidget.h
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> class myWidget : public QWidget { Q_OBJECT public: explicit myWidget(QWidget *parent = nullptr); /*定义信号时必须加上关键字signals. * 信号没有返回值,但可以有参数. * 信号就是函数声明,只需声明,无需定义。 * 使用emit发送. */ signals: void my_singals(); //自定义信号 public slots: void my_slot();//自定义发送信号的槽函数. }; #endif // MYWIDGET_H
widget.h
#ifndef WIDGET_H #define WIDGET_H #include "mywidget.h" #include <QWidget> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } //命名空间 Ui QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); myWidget my_w; //在主窗口中定义子窗口对象. void close_sonwidget(); //接受到子窗口信号时执行的槽函数. private: Ui::Widget *ui; //自定义创建主窗口的槽函数.由于是私有成员,在类外不能使用对象直接调用,和不能在类外进行定义. void create_widget() { my_w.setWindowTitle("子窗口"); my_w.show(); /* * 解释这里为什么不用w.hide()来隐藏主窗口.由于主窗口对象定义于主函数中,和其他函数不在同一个作用域块.注意每一个函数都是一个作用域块。 * 我们会发现非主函数的普通变量在调用完函数后就会被释放.所以除开主函数外其他普通函数中的普通变量不能跨作用域使用。 * 还有注意:主函数的内存空间是最后释放的,这是因为在他里面规定了去调用外面的函数,函数只有调用结束后内存才会被释放.只要存在一个变量还在使用, * 函数就不会调用结束,也就不会释放内存.如闭包,python中的装饰器就是通过这种原理实现的。 */ this->hide(); //this是代表当前对象. } }; #endif // WIDGET_H
# widget.cpp
#include "widget.h" #include "ui_widget.h" #include "QPushButton" #include <QDebug> //#include "mypushbutton.h" //自定义的按钮 Widget::Widget(QWidget *parent):QWidget(parent), ui(new Ui::Widget) //Widget为继承自QWidget类,该处为类外定义构造函数. { ui->setupUi(this); QPushButton *btn1 = new QPushButton; btn1->setParent(this); btn1->setText("切换到子窗口"); connect(btn1,&QPushButton::pressed,this,&Widget::create_widget); connect(&my_w,&myWidget::my_singals,this,&Widget::close_sonwidget); //处理子窗口信号. } void Widget::close_sonwidget() { my_w.hide(); //子窗口关闭. this->show(); //主窗口显示. } Widget::~Widget() { qDebug()<<"释放Widget窗口即父窗口"<<endl; delete ui; }
# mywidget.cpp
#include "mywidget.h" #include <QPushButton> myWidget::myWidget(QWidget *parent) : QWidget(parent) //myWidget类外定义构造函数. { QPushButton *btn2 = new QPushButton; btn2->setParent(this); btn2->setText("切换到主窗口"); connect(btn2,&QPushButton::pressed,this,&myWidget::my_slot);//子窗口发送信号,主窗口接受信号在干事. } void myWidget::my_slot() { emit my_singals(); //发送信号 }