QT编程 自学内容 day01 建立按钮,connect 建立信号的连接 disconnect 断开信号的连接。 触发信号的方式 emit QString 转化为 char *

1.建立第一个 QT 的编程程序

在 写代码注释之前 需要  到  工具   -- 》选项 --》文本编辑器--》行为 --》设置为 UTF -8


2.开始的时候我们会  继承一个父类 一般选择 :   QWidget


3.生成一个按钮:

头文件:#include <QPushButton>

没有函数,只要生成对象, 为对象命名,为他找好父亲

头文件

#ifndef MYVIDGET_H
#define MYVIDGET_H

#include <QWidget>
#include <QString>
#include "teacher.h"
#include "student.h"

class myvidget : public QWidget
{
    Q_OBJECT

public:
    myvidget(QWidget *parent = 0);
    ~myvidget();

};

#endif // MYVIDGET_H

.cpp文件

#include "myvidget.h"
#include <QPushButton>
#include "mypusgbutton.h"
#include<QDebug>


myvidget::myvidget(QWidget *parent)//构造函数
    : QWidget(parent)
{
    //按钮的建立
   //创建一个按钮
    QPushButton * btn = new QPushButton;
    //btn->show(); //show 以顶层方式弹出窗口控件
    //我们需要让 btn 对象 依赖 在 myWidget 窗口中
    btn->setParent(this);//按键存在与 窗口之中
    //显示文本
    btn->setText("第一个按钮");

    //创建第二个按钮 按照控件的大小创建窗口
    QPushButton * btn2 = new QPushButton("第二个按钮",this);//第一个参数 名字, 第二个参数 父类
    //移动btn2 按键
    btn2 ->move(100,100);
    //重置窗口大小
    resize(600,400);//这里是  myWidget 的窗口
    //设置固定的窗口大小(主窗口)
    setFixedSize(600,400);
    //设置窗口的标题
    setWindowTitle("day01");

    MyPusgButton * myBtn = new MyPusgButton;
    myBtn->setText("我自己的按钮");
    myBtn->setFixedSize(200,200);
    myBtn->move(200,0);
    myBtn->setParent(this);//设置到对象树里面



  

}



myvidget::~myvidget()
{
    qDebug()<<"myWidget的析构调用!"<<endl;
}

main.c 文件

#include "myvidget.h"  //头文件的引用
#include <QApplication>//抱哈诺格应用程序类的头文件


//快捷按键
//注释 ctrl + /
//运行 ctrl + r
//编译 ctrl + b
//查找 ctrl + f
//自动对齐  ctrl + i
//同名之间的 .h 和 .cpp 的切换  F4
//帮助文档 F1



//mian 程序入口  ,  argc 命令行变量的数量,  argv 命令行变量的数组
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);//a 应用程序对象,在 QT 中, 应用程序对象,有且只有一个
    myvidget w;//窗口对象, mywidget 父类  ->  QWidget
    w.show();//窗口对象,默认不会显示,必须要调用 show方法 显示窗口
    return a.exec();//让应用程序对象进入消息循环
}


3.

建立信号连接  connect (发送对象,信号函数的地址,接收对象,信号槽函数的地址)

断开信号连接  disconnect (发送对象,信号函数的地址,接收对象,信号槽函数的地址)

在无参函数  有参函数同时存在的时候,信号连接需要用到  函数指针(),不然造成函数的二义性。

函数指针的格式:

函数的返回值类型      类    函数指针的名字  参数类型  =   & 类    函数

void ( student::  * studentSignal  )(  QString)  =  & student:: treat();

void (teacher::  *  tearchersignal )(QString)  =  &  tearcher:: hunry();

 //有参模式
    //连接带参数的信号和槽
    //指针->地址
    //函数指针->函数地址
    void(Teacher:: *teacherSignal)(QString)= &Teacher::hungry;//当有函数重载的时候,这里需要函数指针来指向 有参的信号函数,避免二义性
    void(Student:: *studentSignal)(QString)= &Student::treat;
    connect(zt,teacherSignal,st,studentSignal);//使用函数指针建立信号连接
  

4.QT 4 之前的信号连接的方式

   connect (btn,SIGNAL(clicked()),st,SLOT(treat()));//btn  再次建立信号连接
    */ //1、信号是可以连接信号
    //2、一个信号可以连接多个槽函数
   //3、多个信号_可以连接同一个槽函数
   //4、信号和槽函数的参数必须类型——对应
   //5、信号和槽的参数个数―是不是要一致﹖信号的参数个数可以多佘槽函裁的参数个救
   // Qt4版本以前的信号和糟连接方式
   //利用Qt4信号槽连接无参版本
   //qt4版本底层s工GNAL (hungry")sLOT("treat")
   //connect (zt,SIGNAL (hungry()),SLOT(treat ( ));
   //Qt4版本优点,参数直观,缺点。类型不做检测
   //Qt5以上支持Qt4的版本写法,反之不支持

5.emit  激发函数  调用信号函数

void myvidget::classisover()
{
    //下课的函数,触发老师的饥饿函数,发生信号
    //emit zt->hungry();
    emit zt->hungry("宫保鸡丁");
}

6.本次学习的所有代码

mypusgbutton.h

#ifndef MYPUSGBUTTON_H
#define MYPUSGBUTTON_H

#include <QWidget>
#include <QPushButton>

class MyPusgButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyPusgButton(QWidget *parent = 0);
    ~MyPusgButton();
signals:

public slots:
};

#endif // MYPUSGBUTTON_H

myvidget.h

#ifndef MYVIDGET_H
#define MYVIDGET_H

#include <QWidget>
#include <QString>
#include "teacher.h"
#include "student.h"

class myvidget : public QWidget
{
    Q_OBJECT

public:
    myvidget(QWidget *parent = 0);
    ~myvidget();

private:
    Teacher * zt;//生成一个老师类的指针
    Student * st;//生成一个学生类的指针

    void classisover();//下课的函数

};

#endif // MYVIDGET_H

Student.h

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>
#include <QDebug>
#include <QString>

class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = 0);

signals:

public slots:
    //槽函数  早期的QT 的版本, 必须要写到 public 或者全局下
    //返回值: void  需要声明 也不需要实现(可以实现)
    //可以有参数, 可以发生重载
    void treat();
    void treat(QString foodName);
};

#endif // STUDENT_H

teacher.h

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>
#include <QDebug>
#include <QString>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = 0);

signals:
    //自定义信号 写的地方 signals
    //信号返回值: void  只需要声明,不需要实现(可以实现)
    //可以有参数 ,可以重载
    void hungry();//无参的信号
    void hungry(QString foodName);
public slots:
};

#endif // TEACHER_H

main.cpp

#include "myvidget.h"  //头文件的引用
#include <QApplication>//抱哈诺格应用程序类的头文件


//快捷按键
//注释 ctrl + /
//运行 ctrl + r
//编译 ctrl + b
//查找 ctrl + f
//自动对齐  ctrl + i
//同名之间的 .h 和 .cpp 的切换  F4
//帮助文档 F1



//mian 程序入口  ,  argc 命令行变量的数量,  argv 命令行变量的数组
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);//a 应用程序对象,在 QT 中, 应用程序对象,有且只有一个
    myvidget w;//窗口对象, mywidget 父类  ->  QWidget
    w.show();//窗口对象,默认不会显示,必须要调用 show方法 显示窗口
    return a.exec();//让应用程序对象进入消息循环
}

mypusgbutton.cpp

#include "mypusgbutton.h"
#include<QDebug>

MyPusgButton::MyPusgButton(QWidget *parent) : QPushButton(parent)
{
    qDebug()<< "我的按钮类的构造";
}

MyPusgButton::~MyPusgButton()
{
    qDebug() <<"我的按钮的析构";
}

myvidget.cpp

#include "myvidget.h"
#include <QPushButton>
#include "mypusgbutton.h"
#include<QDebug>


myvidget::myvidget(QWidget *parent)//构造函数
    : QWidget(parent)
{
    //按钮的建立
   //创建一个按钮
    QPushButton * btn = new QPushButton;
    //btn->show(); //show 以顶层方式弹出窗口控件
    //我们需要让 btn 对象 依赖 在 myWidget 窗口中
    btn->setParent(this);//按键存在与 窗口之中
    //显示文本
    btn->setText("第一个按钮");

    //创建第二个按钮 按照控件的大小创建窗口
    QPushButton * btn2 = new QPushButton("第二个按钮",this);
    //移动btn2 按键
    btn2 ->move(100,100);
    //重置窗口大小
    resize(600,400);//这里是  myWidget 的窗口
    //设置固定的窗口大小
    setFixedSize(600,400);
    //设置窗口的标题
    setWindowTitle("day01");

    MyPusgButton * myBtn = new MyPusgButton;
    myBtn->setText("我自己的按钮");
    myBtn->setFixedSize(200,200);
    myBtn->move(200,0);
    myBtn->setParent(this);//设置到对象树里面

     //点击按钮  ,关闭窗口
    //需求点击我的按钮关闭窗口
    //参数1信号的发送者   参数2发送的信号(函数的地址)  参数3︰信号的接受者参数  4处理的槽函数(函数的地址)
    //connect( myBtn,&MyPushButton::clicked,this,&mywidget::close );
    connect( myBtn, &QPushButton::clicked, this, &QWidget::close );//使myBtn 建立信号的连接

    this->zt=new Teacher;//构建一个老师的对象
    this->st=new Student;//构建一个学生的对象
    //老师饿了,学生请客  无参模式
    //connect  信号建立函数 第一个参数,发生信号的对象,
    //connect(zt,&Teacher::hungry,st,&Student::treat);
    //classisover();//触发饿的信号,触发连接

    //有参模式
    //连接带参数的信号和槽
    //指针->地址
    //函数指针->函数地址
    void(Teacher:: *teacherSignal)(QString)= &Teacher::hungry;//当有函数重载的时候,这里需要函数指针来指向 有参的信号函数,避免二义性
    void(Student:: *studentSignal)(QString)= &Student::treat;
    connect(zt,teacherSignal,st,studentSignal);//使用函数指针建立信号连接
    classisover();



    /*
    connect(btn,&QPushButton::clicked,st,&Student::treat);//使btn 建立信号的连接
    connect(btn2,&QPushButton::clicked,st,&Student::treat);

    //断开信号
    disconnect(btn,&QPushButton::clicked,st,&Student::treat);//使btn 断开信号的连接
    

    connect (btn,SIGNAL(clicked()),st,SLOT(treat()));//btn  再次建立信号连接
    */ //1、信号是可以连接信号
    //2、一个信号可以连接多个槽函数
   //3、多个信号_可以连接同一个槽函数
   //4、信号和槽函数的参数必须类型——对应
   //5、信号和槽的参数个数―是不是要一致﹖信号的参数个数可以多佘槽函裁的参数个救
   // Qt4版本以前的信号和糟连接方式
   //利用Qt4信号槽连接无参版本
   //qt4版本底层s工GNAL (hungry")sLOT("treat")
   //connect (zt,SIGNAL (hungry()),SLOT(treat ( ));
   //Qt4版本优点,参数直观,缺点。类型不做检测
   //Qt5以上支持Qt4的版本写法,反之不支持


}

void myvidget::classisover()
{
    //下课的函数,触发老师的饥饿函数,发生信号
    //emit zt->hungry();
    emit zt->hungry("宫保鸡丁");
}

myvidget::~myvidget()
{
    qDebug()<<"myWidget的析构调用!"<<endl;
}

teacher.cpp

#include "teacher.h"

Teacher::Teacher(QObject *parent) : QObject(parent)
{

}


student.cpp

#include "student.h"

Student::Student(QObject *parent) : QObject(parent)
{

}

void Student::treat()
{
    qDebug()<<"请老师吃饭!";

}
void Student::treat(QString foodName)
{
    qDebug()<<"请老师吃饭!"<<foodName;
    //QString -> char * 先转成 QByteArray  (.toUtf8())  再转char *  (.data())
    // 打印的时候,Qstring  会加上 ”  “   , 假如是  char *  这个不会加上 "  "
    qDebug()<<"请老师吃饭!"<<foodName.toUtf8().data();

}

9.知识点 QString  ---- >   char* 

方式在上面的代码里面!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值