QT 学习笔记(四)

由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。
提示:具体项目创建流程和注意事项见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。

在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚心求知的熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值