ガベージコレクションメカニズムとメニューバーツールバー
1.ガベージコレクションのメカニズム
QPushButton* b1 = new QPushButton(this);
ボタンも新しいスペースなので、毎回解放する必要があります。そうしないと、メモリリークが発生します。
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()
{
}
运行结果你会发现不需要手动释放,系统会自动释放
2つの条件:
- 親を指定
- クラスはQObjectを直接または間接的に継承します。
これらの2つの条件が満たされた場合にのみ、システムはサブオブジェクト内の動的に割り当てられたスペースを自動的に解放します
第二に、メニューバーのツールバー
以前使用し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領域:フローティングウィンドウの位置を表します。値は次のとおりです。
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()
{
}