文章目录
由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。
提示:具体项目创建流程和注意事项见
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 开辟的空间,当我们使用完后,要及时释放,不然会有内存泄漏的风险。
- 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。