zoukankan      html  css  js  c++  java
  • 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(); //发送信号
    }
  • 相关阅读:
    关于prototype学习
    java io 从文件的读取和输入
    java 匿名内部类
    动手做个 AI 机器人,帮我回消息!
    几个高效做事的法则,让你的一天有 25 小时
    爆肝一个月,我做了个免费的面试刷题网
    Log4j 被曝核弹级漏洞,开发者炸锅了!
    几个超火的编程网站,别错过!
    Java 处理表格,真的很爽!
    c++智能指针转化:static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_cast
  • 原文地址:https://www.cnblogs.com/1314bjwg/p/12269819.html
Copyright © 2011-2022 走看看