文章目录
一、坐标系统
1. 主窗口移动
2. 子窗口移动
二、内存回收机制
三、代码(坐标系统,内存回收机制)
1. 主窗口头文件 —— widget.h
2. 主窗口源文件 —— widget.cpp
3. 按钮头文件 —— mybutton.h
4. 按钮源文件 —— mybutton.cpp
四、菜单栏,工具栏
1. 菜单栏
2. 工具栏
由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。
提示:具体项目创建流程和注意事项见
QT 学习笔记(一)
提示:具体项目准备工作和细节讲解见
QT 学习笔记(二)
一、坐标系统
- 生成一个新的项目,具体步骤过程见提示。
1. 主窗口移动
- 在源文件 widget.cpp 当中进行代码编写。
- move(x, y) 表示,相对于屏幕而言,以左上角为原点,向右移动 x ,向下移动 y。具体结果如下图所示:
此时,主窗口向右移动 0 ,向下移动 0,生成的窗口应该在左上角。
- 随后,我们修改代码为 move(200, 50),表示主窗口向右移动 200 ,向下移动 50,生成窗口的位置会发生变化。(额,生成的窗口刚好挡住了代码,不过不重要,如此简单的步骤大家肯定都会修改。)
- 肯定有人好奇我的 x,y 如果为负数是什么情况,在这里做一个简单的尝试。具体结果如下图所示::
2. 子窗口移动
- 在源文件 widget.cpp 当中进行代码编写。
- 子窗口的移动方式与主窗口相同,但是子窗口的移动是相对于主窗口的内部区域而言,以左上角为原点,向右移动 x ,向下移动 y。具体结果如下图所示:
那么,当我们有多个子窗口相互嵌套时,每一个子窗口的移动都是在其对应的父窗口当中,以对应父窗口的内部区域为原点,进行移动。具体结果如下图所示:
二、内存回收机制
- 在坐标系统当中,我们使用 new 来在堆区开辟空间,对于 new 开辟的空间,当我们使用完后,要及时释放,不然会有内存泄漏的风险。
二、内存回收机制
- 在坐标系统当中,我们使用 new 来在堆区开辟空间,对于 new 开辟的空间,当我们使用完后,要及时释放,不然会有内存泄漏的风险。
QT 内部会自己生成内部对象数,就像 QObject 是 Qwidget 的指定父对象,Qwidget 是 b1 的指定父对象,b1 是 b2 的指定父对象,整体就会像一个二叉树。
只要我们指定了父对象,当我们的程序结束之后,那些指定父对象的空间假如是动态分配空间的,会自动释放,回收内存。
知识点补充:构造函数生成的,会在析构函数释放,new 与 delete 相对应。
对于上述情况的验证,我们首先需要添加一个对应按钮 mybutton 的头文件和源文件(具体步骤见前文),然后修改相应的 QWidget 为 QPushButton ,因为只有当我继承于 QPushButton ,我才可以是一个按钮。
头文件 mybutton.h
源文件 mybutton.cpp
进行新按钮析构函数的编写和调用后,会得到如下结果:
总结: (1) 指定父对象后,(2) 直接或间接继承于 QObject ,如果满足两个条件任意一个,并且子对象是动态分配空间的 new ,那就不需要手动释放 delete ,系统会自动释放。
三、代码(坐标系统,内存回收机制)
1. 主窗口头文件 —— widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); }; #endif // WIDGET_H
2. 主窗口源文件 —— widget.cpp
#include "widget.h" #include "mybutton.h" #include <QPushButton> Widget::Widget(QWidget *parent) : QWidget(parent) { move(200,200); //主窗口移动 QPushButton *b1=new QPushButton(this); b1->move(100,100); b1->setText("^_^"); b1->resize(100,100); // 设定窗口大小 QPushButton *b2=new QPushButton(b1); b2->move(10,10); b2->setText("$_$"); mybutton *b3 = new mybutton(this); b3->setText("123"); } Widget::~Widget() { }
3. 按钮头文件 —— mybutton.h
#ifndef MYBUTTON_H #define MYBUTTON_H #include <QPushButton> class mybutton : public QPushButton { Q_OBJECT public: explicit mybutton(QWidget *parent = nullptr); ~mybutton(); signals: public slots: }; #endif // MYBUTTON_H
4. 按钮源文件 —— mybutton.cpp
#include "mybutton.h" #include <QDebug> mybutton::mybutton(QWidget *parent) : QPushButton(parent) { } mybutton::~mybutton() { qDebug()<<"按钮被析构"; }
四、菜单栏,工具栏
- 生成一个新的项目,具体步骤过程见提示。
- PC 端开发要使用 MainWindow 。
1. 菜单栏
菜单栏需要包含头文件 #include < QMenuBar > 和 #include < QMenu > 。
知识点补充:在实现对应功能需要调用信号时,要选择相对应功能的信号。
关于各种函数的调用要及时查看帮助文档,写上对应的头文件,注意是否有参数的问题。
模拟日常使用的菜单栏,做一个简易版(代码解释以注释的形式放在代码当中):
//菜单栏 QMenuBar *mbar = menuBar(); //添加菜单 QMenu *pfile = mbar->addMenu("文件"); //添加菜单项,添加动作 QAction *pnew = pfile->addAction("新建"); connect(pnew,&QAction::triggered, [=]() { qDebug()<<"新建被按下"; } ); pfile->addSeparator(); // 添加分割线 QAction *popen = pfile->addAction("打开");
2. 工具栏
- 工具栏是菜单栏的快捷方式。
- 基本步骤与菜单栏的制作大同小异。
//工具栏,菜单栏的快捷方式 QToolBar *toolbar = addToolBar("toolbar"); //工具栏添加快捷键 toolbar->addAction(pnew); QPushButton *b = new QPushButton(this); b->setText("^_^"); //添加小控件 toolbar->addWidget(b); connect(b,&QPushButton::clicked, [=]() { b->setText("123"); } );
点击 ^ _ ^ 变成 123。