Garbage collection mechanism and menu bar toolbar

Garbage collection mechanism and menu bar toolbar

1. Garbage collection mechanism

QPushButton* b1 = new QPushButton(this);

The button is also new space, so it needs to be released every time, otherwise it will cause a memory leak.

1. Qt中有一个对象树,如果指定父对象并且是直接或间接继承QObject,那么如果子对象是动态分配空间的,就不需要手动释放,系统会自动释放
Insert picture description here
2. Verification

We cannot modify the button class encapsulated by 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()
{

}

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

Two conditions:

  • Specify parent
  • The class inherits QObject directly or indirectly ,

The system will automatically release the dynamically allocated space in the sub-objects only if these two conditions are met

Second, the menu bar toolbar

What we have been using before is QWidgets基类控件that it provides windows, buttons, etc.

Now we use QMainWindow基类控件to provide the interface of the menu bar

class MainWindow : public QMainWindow
{}

1. Menu Bar

Header file :

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

QMainWindow::menuBarfunction:

QMenuBar *QMainWindow::menuBar() const

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

  • 添加菜单

QMenuBar::addMenufunction:

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

The function of the parameter const QString &title为菜单的名字
function is to add a menu

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

addAction函数

QAction *addAction(const QString &text)

The parameter const QString & text represents the name of the menu item or action to
create a menu item

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

Function This signal is issued when the user activates an operation; for example, when the user clicks a menu option, toolbar button, or presses the shortcut key combination of the operation,

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

The function of the function is to add a dividing line for each menu item in the menu bar , so that the menu item is more clear.

2. Toolbar

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

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

QMainWindow::addToolBarfunction:

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

The role is to add a toolbar

  • 添加工具(快捷方式)

addAction函数

QAction *addAction(const QString &text)

The parameter const QString & text represents the tool name

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

Used in tools to add small controls

3. Status bar

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

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

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

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

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

4. Core controls

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

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

5. Floating window

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

Qt :: DockWidgetArea area: represents the position of the floating window , the values ​​are as follows:


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)

effect将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()
{

}
Published 158 original articles · praised 117 · 90,000 views

Guess you like

Origin blog.csdn.net/wolfGuiDao/article/details/105478484