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(); //發送信號 }