标签搜索

目 录CONTENT

文章目录

垃圾回收机制和菜单栏工具栏.md

小小城
2021-08-22 / 0 评论 / 0 点赞 / 6 阅读 / 4,741 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

垃圾回收机制和菜单栏工具栏

@[toc]

一、垃圾回收机制

QPushButton* b1 = new QPushButton(this);

按钮也是new出来的空间,所以每次都需要进行释放,否则会造成内存泄漏。

1. Qt中有一个对象树,如果指定父对象并且是直接或间接继承QObject,那么如果子对象是动态分配空间的,就不需要手动释放,系统会自动释放
在这里插入图片描述
2. 验证

因为Qt封装的按钮类,我们无法修改,所以自己写一个按钮类,动态申请空间,看是否会自动调用析构函数释放空间

mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QDebug>

class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);
    ~MyButton();

signals:

public slots:
};

#endif // MYBUTTON_H

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>
#include "mybutton.h"

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();
};

#endif // MYWIDGET_H

mybutton.cpp

#include "mybutton.h"

MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{

}
MyButton::~MyButton()
{
    qDebug()<<"i am ~MyButton()";
}

mywidget.cpp

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    MyButton* b3 = new MyButton(this);
    MyButton* b4 = new MyButton(this);
}

MyWidget::~MyWidget()
{

}

运行结果你会发现不需要手动释放,系统会自动释放

两个条件:

  •  指定父对象
  •  类是直接或间接继承QObject

满足这两个条件系统才会自动释放子对象中动态分配的空间

二、菜单栏工具栏

之前我们一直用的是QWidgets基类控件,其提供窗口、按钮等。

现在我们使用QMainWindow基类控件,提供菜单栏的界面

class MainWindow : public QMainWindow
{}

1.菜单栏

头文件

#include <QMenuBar>
#include <QMenu>
  •  创建菜单栏

QMainWindow::menuBar函数:

QMenuBar *QMainWindow::menuBar() const

作用:返回主窗口的菜单栏。如果菜单栏不存在,这个函数创建并返回一个空的菜单栏。

  •  添加菜单

QMenuBar::addMenu函数:

QMenu *QMenuBar::addMenu(const QString &title)

参数const QString &title为菜单的名字
函数的作用是添加一个菜单

  •  添加菜单项(下拉菜单)动作
//头文件
#include <QAction>

addAction函数

QAction *addAction(const QString &text)

参数const QString &text代表菜单项或动作的名字
作用创建一个菜单项

  •  为菜单项添加动作
void triggered(bool checked = false);

作用当用户激活某个操作时发出此信号;例如,当用户单击菜单选项、工具栏按钮或按下操作的快捷键组合时,

  •  为菜单项添加分割线
QAction *QMenu::addSeparator()

函数的作用就是为菜单栏的每个菜单项添加分割线,让菜单项更加清晰。

2.工具栏

工具栏就相当于是菜单栏当中每个菜单中菜单项的快捷方式

  •  添加工具栏
//头文件
#include <QToolBar>

QMainWindow::addToolBar函数:

QToolBar *QMainWindow::addToolBar(const QString &title)

作用就是添加一个工具栏

  •  添加工具(快捷方式)

addAction函数

QAction *addAction(const QString &text)

参数const QString &text代表工具名字

  •  添加小控件
QAction *QToolBar::addWidget(QWidget *widget)

作用在工具来添加小控件

3.状态栏

  •  添加状态栏
//头文件
#include <QStatusBar>
  •  添加标签
//头文件
#include <QLabel>

从左往右向状态栏添加状态

void QStatusBar::addWidget(QWidget *widget, int stretch = 0)

从右往左向状态栏添加状态

void QStatusBar::addPermanentWidget(QWidget *widget, int stretch = 0)

4.核心控件

  •  添加文本编辑区
//头文件
#include <QTextEdit>
void QMainWindow::setCentralWidget(QWidget *widget)

将给定的小部件设置为主窗口的中心小部件。

5.浮动窗口

  •  添加浮动窗口
//头文件
#include <QDockWidget>
  •  addDockWidget函数:
void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)

Qt::DockWidgetArea area:代表浮动窗口的位置,取值如下:


Constant Value
Qt::LeftDockWidgetArea 0x1
Qt::RightDockWidgetArea 0x2
Qt::TopDockWidgetArea 0x4
Qt::BottomDockWidgetArea 0x8
Qt::AllDockWidgetAreas
DockWidgetArea_Mask
Qt::NoDockWidgetArea 0

QDockWidget *dockwidget:代表要添加的浮动窗口
作用将给定的dockwidget添加到指定区域

  •  addDockWidget函数
void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation)

作用将dockwidget按方向指定的方向添加到给定区域

完整代码:
mainwindow.cpp

#include "mainwindow.h"
#include <QMenuBar>//菜单栏
#include <QMenu>//菜单
#include <QAction>//菜单项
#include <QDebug>//输出
#include <QToolBar>//工具栏
#include <QPushButton>//按钮
#include <QStatusBar>//状态栏
#include <QLabel>//标签
#include <QTextEdit>//文本编辑器
#include <QDockWidget>//浮动窗口

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QMenuBar* mBar = menuBar();//1.创建一个菜单栏,不用new,直接使用创建好的
    QMenu* pFile = mBar->addMenu("file");//为菜单栏添加菜单
    QAction* pNew =  pFile->addAction("new");//为菜单添加菜单项

    connect(pNew,&QAction::triggered,[=]()//为菜单项添加动作
    {
        qDebug()<<"new is anxia";
    });
    pFile->addSeparator();//为菜单项添加分割线
    QAction* pOpen =  pFile->addAction("open");//再添加一个菜单项
	QToolBar* toolBar = addToolBar("toolBar");//2.添加工具栏
    toolBar->addAction(pNew);//为工具栏添加工具

    QPushButton* b = new QPushButton(this);//按钮控件
    b->setText("^_^");
    toolBar->addWidget(b);//为工具栏添加按钮小控件

    connect(b,&QPushButton::clicked,[=]()//关联按钮动作
    {
        b->setText("@_@");
    }); 
    
	QStatusBar* staBar = statusBar();//3.添加状态栏
    QLabel* label = new QLabel(this);//添加标签
    label->setText("Normal text file");//为标签指定内容
    
    staBar->addWidget(label);//把标签放到状态栏显示,从左往右显示
    staBar->addWidget(new QLabel("999",this));
    staBar->addPermanentWidget(new QLabel("666",this));//从右往左显示

    QTextEdit* textEdit = new QTextEdit(this);//4.创建核心控件--文本编辑器
    setCentralWidget(textEdit);//把文本编辑器放在窗口中央


    QDockWidget* dock = new QDockWidget(this);//5.创建浮动窗口
    addDockWidget(Qt::RightDockWidgetArea,dock);//把浮动窗口放在主窗口的右边
    
    QTextEdit* textEdit1 = new QTextEdit(dock);//为浮动窗口添加编辑器
    setCentralWidget(textEdit1);//把文本编辑器放在浮动窗口的中央
}
MainWindow::~MainWindow()
{

}
0

评论区