ガベージコレクションメカニズムとメニューバーツールバー

ガベージコレクションメカニズムとメニューバーツールバー

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

}
158件の元の記事を公開 117件を賞賛 90,000回の閲覧

おすすめ

転載: blog.csdn.net/wolfGuiDao/article/details/105478484