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*
方式在上面的代码里面!!