一、Qt简单介绍:
1、QT的简单理解:
Qt简单的说就是一种可以跨平台的编程语言工具,可以直接类比C语言和C++.
且一般QT的代码逻辑也是以C语言和C++(也可以适用于像JS的语言),可以直观理解于VScode、vs2019.
不过它主要处理是以应用程序开发为主。(拿来直接当C编译器也是不错的)。
2、QT支持的范围广:
QT能够适用于面前市场上的大部分平台,如:iOS、Android、WP,iOS、Android、它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。
其他:像QT的发展史和其余的集合就不再细讲,不过这里注意一点就是在4版本之前的QT会对于目前的平台有些不适用,或者存在代码bug报错的情况。
二、QT的安装和配置:
1、注意点:
对于QT的安装的配置,建议一步一步操作来,不然可能会出现,类似这样的警告:
qt.winrtrunner: Using the AppxPhone profile.
qt.winrtrunner: Failed to connect to device: 0x89731810 "Deployment failed because no device was detected. Make sure a device is connected and powered on."
并且可能出现重装了,还是无法进行应用程序正常打印输出(如:进行qDebug()打印的时候)
2、举例:
这里就以QT的安装与VS配置的注意细节为主。主要的流程配置流程可以参考这篇文章:https://blog.csdn.net/qq_40642828/article/details/104340768
需要注意的是:
在新的版本里它对应的兼容环境更多所以出现的QT.app块是正常的。
在QT vs tools中选择:option后会出现下图
选择中间项,进行更改就行了,这是在新的版本才有的,旧版本它里面就只有按原先连接里的那样就可以了(有一说一,还是原先的版本好用,理不清干嘛改的这么的不人性)
剩下的直接按链接的进行就行了。
三、QT项目文件创建流程
1、注意点:
路径(code)不能带有中文不然可能会报错,命名上也不能带有中文,凡事不带中文。(挺那啥的,气抖冷)
2、流程:
模块包含:
widget 窗口模块 mainwindows等模块,一般选取widget 窗口。
四、代码区前期理解:
1、初始文件含义:
QT += core gui//包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets//窗口模块-5版本上的才有
//有的你会看到在你的生成的文件里会有
//TARGET = 01_QtFirst//这是你自定义取的名字
//TEMPLATE = app//模板框架使用了应用程序框架
CONFIG += c++11//在以前的就版本里面是没有这个的,所以在编译时,旧版本会出现一些代码不兼容的现象或者是bug
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked 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 it uses 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
//前期使用时可以不用下面这个,它在你生成文件时,不要点击下标生成.ui的文件就好了,如下图。
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#include "mainwindow.h"//包含你在项目中设置的头文件
#include <QApplication>//应用程序类
//argc命令行变量的数量 argv 命令行变量 数组
int main(int argc, char *argv[])
{
QApplication a(argc, argv);//应用程序对象 QT中有且仅有一个应用对象,会从系统中拿到对象
MainWindow w;//创建一个自定义窗口对象-是创建在站
w.show();//窗口对象 默认是不会弹出来,需要调用show函数 进行显示
return a.exec();//a.exec()进入消息循环机制 死循环,阻塞代码
//等效进入死循环
// while (true) {
// }
}
mainwindow.cpp或者mywidget.cpp,这个根据你自己设置的选取的定义,项目初建时的对象树的选取。
2、在QT中的一些快捷键的使用
可以直接将下面这段拷贝(在前期不熟之前 )
/*
* 命名规范
* 类名 首字母大写,单词和单词之间 首子盲目大写
* 函数名、变量名。。。。首字母小写 单词和单词之间首字母大写
* 常用快捷键
* 运行ctrl +R
* 编译 ctrl+B
* 帮助文档F1
*注释ctrl+/
*查找 ctrl+f
*
*/
3、基础学习篇一(上)-代码知识
这是前期需要具备的一些代码知识
#include "widget.h"
#include "ui_widget.h"
//在这里如果你想要使用到界面上的某个功能定义的时候,需要将对应的头文件给添上
#include<QPushButton>//按键
#include<QDebug>//打印输出
#include"student.h"//自定义头文件
#include"teacher.h"//自定义头文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// QPushButton *bnt=new QPushButton;/按键对象的创立
// bnt->setParent(this);
// //bnt->show();//在这里的()中不加上this,这样的话就会出现不同的窗口,那样窗口就很多
// bnt->setText("第一个键");//给你所创建你的按键取名,除了可以在帮助助手那里查,还有就是,直接英文翻译
//connect(bnt,&QPushButton::clicked,this,&QPushButton::close);//&要用取得的那个引用,底层进行的是常量指针的行为
// QPushButton *but2=new QPushButton("第二个键");
// but2->setParent(this);
// but2->move(100,100);
// this->setWindowTitle("窗口名字");
// resize(200,200);
// this->setFixedSize(100,100);// 来强制设置好窗口的大小长宽
st=new student(this);
tt=new teacher(this);
void(teacher::*teachersignals)(QString)=&teacher::hurry;//c++知识,在不同函数文件下,需要加上作用域,,不然就会默认为基类/父类的函数或对象,可能会引用不到
void(student::*studentslots)(QString)=&student::treat;//指针函数来重名重载使用
connect(tt,teachersignals,st,studentslots);//信号发生者 信号 接收者 行为(槽)
//断开连接就是直接英文dis前缀放在connnect之前
classIsover();//调用
}
void Widget::classIsover()//都要加上作用域,不然他不知道是谁的 定义
{
//触发用 emit
emit tt->hurry("谁你的定义的词");//有括号//这个取决你的是否要传入
}
Widget::~Widget()
{
delete ui;
qDebug()<< "打印吗?"<<endl;//这里和C++中的cout<<""<<endl;同样的作用
//不过它的输出的窗口一般是在应用程序输出框,你可以用ctrl+3的方式找到这个框
//如果需要在弹出的ui窗口进行输出的话就需要进行对应的管理使用。
}
对象的释放,创建在栈上,一般是用先进后出的理论,在这里也是适用的,不过由于QT他会进对象的树的判断,所以在你在对应的构造函数中进行qDebug打印的时候会发现这个打印是按队列现金先出的方式,不过那只是由于他对于自身需要进行子类和父类对的判断,确定在这个类下面已经没有子类了,才会将他释放掉。