垃圾回收机制和菜单栏工具栏
垃圾回收机制和菜单栏工具栏文章目录垃圾回收机制和菜单栏工具栏一、垃圾回收机制二、菜单栏工具栏一、垃圾回收机制QPushButton* b1 = new QPushButton(this);按钮也是new出来的空间,所以每次都需要进行释放,否则会造成内存泄漏。1. Qt中有一个对象树,如果指定父对象并且是直接或间接继承QObject,那么如果子对象是动态分配空间的,就不需要手动释放,系统...
垃圾回收机制和菜单栏工具栏
一、垃圾回收机制
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)