Qt中的信號和槽函數。


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM