文章首发在博主知乎
1.程序介绍
1.1 .pro文件
#-------------------------------------------------
#
# Project created by QtCreator 2020-03-04T13:51:48
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Q2//可修改主菜单名字
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
int main(int argc, char *argv[])
{
//only one,应用程序对象,有且仅仅有一个
QApplication a(argc, argv);
//窗口对象,默认不会显示
MainWindow w;
//显示窗口,默认单独弹出
w.show();
//应用程序进入消息阻塞
return a.exec();
}
注释:ctrl + /
运行:ctrl + r
编译:ctrl + b
字体缩放:ctrl + 鼠标滚轮
查找:ctrl + f
整体移动:ctrl + shift +方向键
自动对齐:ctrl +i
帮助文档:F1
同名之间的 .h 和 .cpp之间切换 F4
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//创建一个按钮
QPushButton *btn=new QPushButton();
//依附在主主菜单上
btn->setParent(this);
//按钮标题
btn->setText("one");
//按钮坐标
btn->move(0,0);
//第二个按钮
QPushButton *btn2=new QPushButton("two",this);
//按钮大小
btn2->resize(200,200);
btn2->move(100,100);
//主菜单大小,可以拖拽
resize(600,400);
//固定主菜单大小
setFixedSize(400,400);
// ui->setupUi(this);
//主菜单标题
setWindowTitle("lyy");
}
结果显示:
从上到下构建,从下到上析构
自建一个类,此类自己选定父亲类,同时生成.h和.cpp文件,包括 .pro中也自动生成,不用手动添加。
生成的.h
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
//自动生成的父类,现在要改成我的父类
#include <QWidget>//改
#include <QPushButton>
class myPushButton : public QPushButton
{
Q_OBJECT
public:
//形参不用改动
explicit myPushButton(QWidget *parent = nullptr);
//添加代码
~myPushButton();
signals:
public slots:
};
#endif // MYPUSHBUTTON_H
生成的.cpp
#include "mypushbutton.h"#include <QDebug>//打印头文件
myPushButton::myPushButton(QWidget *parent) : QPushButton(parent)
{
qDebug()<<"gou zao";
}
myPushButton::~myPushButton()
{
qDebug()<<"xi gou";
}
在mainwindow.cpp中添加:
//增加自己的button
myPushButton *mybt=new myPushButton;
mybt->setText("my button");
mybt->move(200,0);
//设置到对象树中
mybt->setParent(this);
左上角为原点,右为X,下为Y正方向
需求:实现点击button,菜单关闭的功能。
在mainwindow.cpp中添加
connect(信号的发送者,发送的信号,信号的接收者,处理的槽函数)
connect(mybt,&myPushButton::clicked,this,&QWidget::close);
需求:老师类,学生类,下课后,老师饿了,学生请吃饭
自定义信号:
在teahcer.h中:
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定义信号
void hungry();
public slots:
};
#endif // TEACHER_H
在student.h中:
自定义槽函数:
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
//自定义 信号槽
void treat();
};
#endif // STUDENT_H
widget.cpp 创建对象,进行链接
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//对象创建
this->zt=new Teacher();
this->st=new Student();
connect(zt,&Teacher::hungry,st,&Student::treat);
classIsOver();
}
//自定义函数
void Widget::classIsOver()
{
emit zt->hungry();
}
teache.h:
signals:
//自定义信号
void hungry();
void hungry(QString foodName);
student.h:
public slots:
//自定义 信号槽
void treat();
void treat(QString foodName);
student.cpp:
void Student::treat(QString foodNmae)
{
qDebug<<"请老师吃饭,点菜"<<foodName;
}
实现
{
//对象创建
this->zt=new Teacher();
this->st=new Student();
connect(zt,&Teacher::hungry,st,&Student::treat);
classIsOver();
}
void Widget::classIsOver()
{
emit zt->hungry(“土豆块”);
}
报错:
修改:
//自定义指针
//指针 -> 地址
//函数指针 -> 函数地址
void(Teacher:: *teacherSignal)(QString)=&Teacher::hungry;
void (Student:: *studentSlot)(QString)=&Student::treat;
connect(zt,teacherSignal,st,studentSlot);
classIsOver();
what, 怎么还有引号?
修改student.h
void Student::treat(QString foodNmae)
{
qDebug<<"请老师吃饭,点菜"<<foodName.toUtf8().data();
}
需求:点击一个下课的按钮,触发下课。
实现中添加:
继续上方有参数的函数中实现
QPushButton *but=new QPushButton("xia ke",this);
this-> resize(600,400);
connect(but,&QPushButton::clicked,this,&Widget::classIsOver);
无参数的函数中实现:
信号链接信号
实现函数修改
//无参数
void(Teacher:: *teacherSignal2)(void)=&Teacher::hungry;
void (Student:: *studentSlot2)(void)=&Student::treat;
connect(zt,teacherSignal2,st,studentSlot2);
//信号链接信号
connect(but,&QPushButton::clicked,zt,teacherSignal2);
具体过程演示:
断开信号的链接
disconnect(zt,teacherSignal2,st,studentSlot2);
笔记如下:
参考:黑马程序员