一、认识QT的一些初始代码1. Q_OBJECT如果类要使用信号槽就需要引入这个宏。2. Widget(QWidget *parent nullptr);这个是引入对象树的概念即创建的 Qt 对象可以通过绑定父节点从而加入对象树。3. Ui::Widget *ui这个则是和form file密切相关的也就是可视化界面和代码的桥梁。4. ui-setupUi(this);设计文件准备好的界面真正地“组装”并显示在窗口上。1.对象树对象树负责把内容组织起来然后在合适的时机如窗口关闭将对象统一释放。因此推荐使用堆来开辟空间如果放在栈上对应的枝干可能会提前释放导致界面中该控件消失。要点只有继承QObject的类才能加入对象树。只有当对象需要被管理的时候才应挂到对象树上。当父对象被销毁时它会自动销毁其所有子对象通过析构函数实现无需手动释放。2.字符集在Qt中如果使用cout的方式打印中文大概率会出现乱码因为cout默认使用本地编码如 Windows 下GBKLinux 下UTF-8而 Qt 内部为 Unicode因此可以采取 qDebug来代替cout二、信号槽和ui的简单了解2.1 信号槽1.介绍通过connect函数可将一个对象发出的信号如按钮的点击事件与另一个对象的槽函数即普通成员函数关联起来。当用户触发该事件如点击按钮时对应的槽函数会被自动调用执行。// bool QObject::connect(const QObject *sender, PointerToMemberFunction signal, // const QObject *receiver, PointerToMemberFunction method); // 功能将一个对象发出的信号连接到另一个对象的槽函数或信号实现对象间通信 #include QObject #include QDebug // 参数说明 // • sender 发出信号的对象指针必须继承自 QObject // • signal 指向成员函数的指针表示信号 // • receiver 接收信号并执行槽的对象指针 // • method 指向成员函数的指针表示槽或另一个信号 // 返回值 // • 成功连接返回 true失败返回 false注意信号必须由发送对象所属类定义槽通常作为接收对象的成员函数实现。例如若使用一个按钮对象如QPushButton则其发出的信号如clicked()只能是该按钮类及其父类所声明的信号若槽函数属于主窗口“桌面对象”则该槽是窗口类的方法。2.2 ui了解在使用 Qt Designer 创建 UI 界面时每个控件都会被赋予一个objectName属性。当.ui文件被编译为 Python 代码后生成的 UI 类会将控件以该objectName作为实例属性名从而允许在代码中通过ui.objectName的方式直接访问对应控件。三、QT坐标系1.坐标种类数学坐标系通常为右手坐标系原点位于图形或空间的中心x 轴向右为正y 轴向上为正计算机图形坐标系通常为左手坐标系原点位于父窗口或画布的左上角x 轴向右为正y 轴向下为正。2.move函数#include QWidget // void QWidget::move( // int x, // int y // ); // 功能 // 将窗口部件widget移动到其父窗口或屏幕坐标系中的指定位置 // 对于顶层窗口无父窗口坐标相对于屏幕左上角 // 对于子窗口部件坐标相对于父窗口部件的客户区左上角 // 参数说明 // int x: // 新的 x 坐标水平位置 // int y: // 新的 y 坐标垂直位置四、信号上1.信号三要素信号源Sender发出信号的控件或对象信号类型Signal由特定用户操作或状态变化触发的、对象所支持的具体信号。信号处理方式Slot用于响应信号的可调用对象通常为函数或方法本质上是一种回调机制。2.槽和信号的图标槽信号3.自定义槽自定义槽在 Qt5 及之后版本中本质上就是普通函数或方法无需特殊语法但在 Qt4 及更早版本中必须将槽显式声明在public slots:、protected slots:或private slots:区域中否则无法被元对象系统识别。若槽函数采用命名规范on_对象名_信号名()且对应的控件已通过setObjectName()设置了匹配的对象名则可以借助QMetaObject::connectSlotsByName()实现自动连接无需手动调用connect()。4.自定义信号信号在语法上类似于函数声明但其本质并非普通函数它必须在类的signals:Qt5 起或Q_SIGNALS:兼容宏访问控制段中声明才能被 Qt 的元对象编译器识别为信号信号的返回值必须为void可带有参数且支持重载connect()的作用只是建立信号与槽之间的连接关系它本身不会执行槽函数只有当信号被实际发射emit时已连接的槽才会被调用。不过Qt5可以不写emit因为全都装在信号函数里面了但是为了可读性还是建议写。然后如果信号充当槽那么相当于emit 这个信号不管是内置还是自定义的。五、信号下1.参数自定义信号和槽都可以携带参数声明的时候可以不携带参数名C的规则在连接时槽的参数个数不能多于信号的参数个数内置的信号有的也会携带参数但是不是由我们传递。2.信号槽的意义信号与槽的解耦设计核心目的是实现对象间的松耦合通信并天然支持以下关系一对多一个信号可连接多个槽广播事件多对一多个信号可连接同一个槽统一处理多对多复杂场景下任意组合如多个发送者触发多个接收者的不同响应。3.disconnect作用取消信号和槽的关系参数和connect一样4.lambda表达式格式【捕获列表】函数参数{函数体}【】里面放要捕获的变量如果是则捕获上一层作用域的所有变量则是在的基础上捕获所用变量的引用Qt不推荐六、QT安装包链接https://pan.baidu.com/s/1pwrYhDxSrjTa7GAQ9_NOQg提取码bite