以下过程都以Qt6为例
一、新建工程
注意工程名和目录名都不能出现中文,不然可能会运行不出来
选择cmake编译
Qwidget是QMainWindow和QDialog的父类。
因此选择QMainWindow和QDialog作为基类,有更多初始功能。
kits中一般选择MInGW作为编译器
其他:
点击分栏,可以设置左右分栏功能
二、第一个工程
项目列表
main.cpp
#include "widget.h" #include <QApplication>//包含一个应用程序类的头文件 #include <QLocale> #include <QTranslator> //main程序入口 argc命令行变量数量 argv命令行变量数组 int main(int argc, char *argv[]) { //a应用程序对象,在Qt中,应用程序对象 有且仅有一个 QApplication a(argc, argv); //窗口对象 myWidget父类->Qwidget Widget w; //窗口对象 默认不会显示,必须要调用show方法显示窗口 w.show(); //让应用程序对象进入消息循环(让代码阻塞到这行) return a.exec(); } //1.Qt简介 // 1.1跨平台图形引擎 // 1.2历史 // 1.3优点 // 1.3.1跨平台 // 1.3.2接口简单,容易上手 // 1.3.3一定程度上简化了内存回收 // 1.4版本(商业、开源) // 1.5成功案例 //2.创建第一个Qt项目 // 2.1点击创建项目,名称不能有中文和空格,路径不能有中文 // 2.2默认创建有3个窗口类 // 2.3main函数 // 2.3.1 QApplication a 应用程序对象,有且仅有一个 // 2.3.2 myWidget w;实例化窗口对象 // 2.3.3 w.show();调用show函数 显示窗口 // 2.3.4 return a.exec(); 让应用程序进入消息循环机制中,代码阻塞到当前行
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget>//包含头文件 QWidget 窗口类 class Widget : public QWidget { Q_OBJECT //Q_OBJECT宏,允许类中使用信号和槽的机制 public: Widget(QWidget *parent = nullptr);//有参构造函数 ~Widget();//析构函数 }; #endif // WIDGET_H
widget.cpp
#include "widget.h" Widget::Widget(QWidget *parent)//实现构造函数 : QWidget(parent)//初始化列表 { } Widget::~Widget() { } //命名: // 类名:首字母大写, 单词和单词之间首字母大写 // 函数名:首字母小写,单词和单词之间首字母大写 //快捷键 // 注释 ctrl+/ // 运行 ctrl+R // 编译 ctrl+B // 字体缩放 ctrl+鼠标滚轮 // 查找 ctrl+F // 整行移动 ctrl + shift + ↑或者↓ // 帮助文档 选中代码+F1(点两次F1进入全屏,Esc退出) // 自动对齐 ctrl+i // 同名之间 .h和.cpp切换 F4 //帮助文档 第一种方式 F1 第二种 左侧按钮 第三种 直接去安装目录找文档 D:\QT\6.2.2\mingw_64\bin
三、QPushButton创建
#include "widget.h" #include<QPushButton> //按钮空间头文件 Widget::Widget(QWidget *parent)//实现构造函数 : QWidget(parent)//初始化列表 { //创建一个按钮 QPushButton *btn=new QPushButton(); //btn->show();//show以顶层得方式弹出空间 //让button对象 依赖在widget窗口中 btn->setParent(this); //this就是当前对象的指针 //显示文本 btn->setText("第一个按钮"); //创建第二个按钮 按照按钮的大小创建窗口(会影响窗口widget) QPushButton *btn2=new QPushButton("第二个按钮",this); //移动btn2按钮 btn2->move(100,100); //设置按钮大小 btn2->resize(50,50); //设置窗口大小(用户可以拖拽) resize(600,400); //设置固定窗口大小 setFixedSize(600,400); //设置窗口标题 setWindowTitle("第一个窗口"); }
总结:QPushButton
四、对象树
每个QObject对象都有children列表,当父对象被析构的时候,子对象也会被析构
因此如果setParent有父对象后,就不需要对子对象手动进行释放了。
释放顺序:先子对象 后 父对象 (调用析构的时候,先打印父类的,再检查子类的。 最后子类释放完,父类的析构也结束了)
第一步: 创建一个类
想创建一个MyPushButton类,继承QPushButton类
首先ctrl+N创建一个类
因为想创建一个MyPushButton,由于QPushButton继承于QWedget,因此这边也选择QWidget
注意要添加到当前项目
点击完成
选择是
注意在CMakeLists.txt中加入,新的文件.cpp和.h,这样才能在工程中找到(否则只能在文件夹中找到,而在工程中却找不到)
这样就完成了创建(如果字符过长,仅仅显示的时候会自动补空格,并不影响)
第二步:修改继承类为QPushButton
在mypushbutton.h中修改继承对象为QPushButton
,并定义析构函数
#ifndef MYPUSHBUTTON_H #define MYPUSHBUTTON_H #include <QPushButton> class MyPushButton : public QPushButton//修改的部分 { Q_OBJECT public: explicit MyPushButton(QPushButton *parent = nullptr);//修改的部分 ~MyPushButton(); //定义析构函数 signals: }; #endif // MYPUSHBUTTON_H
在mypushbutton.cpp中修改继承对象为QPushButton
,实现构造函数和析构函数
#include "mypushbutton.h" #include<QDebug> //用于输出信息 MyPushButton::MyPushButton(QPushButton *parent)//构造函数 : QPushButton{parent} { qDebug()<<"myPushButton constructor"; } MyPushButton::~MyPushButton()//析构函数 { qDebug()<<"myPushButton destructor"; }
第三步:在wedget窗口中创建MyPushButton对象
widget.cpp
首先加入头文件
#include "mypushbutton.h" #include "QDebug"
在widget构造函数中添加
//创建一个自己的按钮对象 MyPushButton *myBtn=new MyPushButton; myBtn->setText("我自己的按钮"); myBtn->move(200,0); myBtn->setParent(this);//设置到对象树中
给widget实现析构函数
Widget::~Widget() { qDebug()<<"widget destructor"; }
步骤4:运行
可以发现控制台中,先打印父对象的析构。但是实际上是先析构子对象,都释放完后才析构父对象。
总结
五、Qt窗口坐标系
其他
设置utf-8编码
(然而实际上控制台输出中文依然可以能乱码)
工具-》选项-》文本编辑器-》行为-》默认编码设置为UTF-8 这样中文就不会乱码了