【QT】04 对象树(对象模型)

4.1 对象树概念

  在qt中创建对象的时候会提供一个Parent对象指针,下面来解释这个Parent指针是干什么的:
  (1)QObject是以对象树的形式组织起来的
在这里插入图片描述
  (2)当创建一个对象QObject对象时,会看到QObject的构造函数接收一个QObject指针为参数,这个参数就是Parent,也就是父对象指针。这相当于,在创建QObject对象时,可以提供一个其父对象(指定父亲),我们创建的这个QObject对象会自动添加到其父对象的children()列表
   (3)当父对象析构的时候,其父对象的children()列表中的所有对象也会被析构(注意这里的父对象并不是继承意义上的父类)。形象化的解释就是当释放窗口时,窗口内的组件对象也会被释放,这是合理的
  (4)因此可以在代码中肆意创建对象,只要指定父对象,父对象包含管理释放(析构),那么子对象在父对象析构的时候会自动析构。
  (5)对象树中,析构的顺序和构造的顺序是相反的

4.2 对象树构造及析构过程(释放对象)

4.3.1 前提准备

  首先创建项目,创建项目的详细操作步骤参考博客:https://blog.csdn.net/qq_36926037/article/details/123720720
在这里插入图片描述

4.3.2 对象树的构建及析构过程

  (1)自定义按钮类:在项目中创建新文件(包含cpp和h)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  (2)修改头文件(.h)文件,让自定义按钮类继承QPushButton类(自定义的类为QPushButton类的子类),并且创建该类的构造函数和析构函数
在这里插入图片描述
在这里插入图片描述

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H

#include <QWidget>

#include <QPushButton>
class MyPushButton : public QPushButton
        //修改为继承自QPushButton类
{
    Q_OBJECT
public:
    explicit MyPushButton(QWidget *parent = nullptr);

//    //构造函数
//    MyPushButton();
    //析构函数
    ~MyPushButton();

signals:

};

#endif // MYPUSHBUTTON_H

  (3)修改自定义按钮类的源文件(.cpp),实现头文件中的构造函数和析构函数。

#include "mypushbutton.h"

//引入打印信息的头文件
#include <QDebug>

MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{
    qDebug()<<"我的按钮类的构造"<<endl;
}
MyPushButton::~MyPushButton()
{
    qDebug()<<"我的按钮类的析构"<<endl;
}

在这里插入图片描述
  (4)在窗口源文件中,使用自定义的按钮类。构建对象数(对象树的父对象是窗口对象,子对象为依赖窗口对象的其他组件的对象)

#include "mywidget.h"
//(1)引入按钮头文件
#include "QPushButton"
//引入自定义的按钮
#include <mypushbutton.h>
myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    //(2)创建第一个按钮:首先引入头文件
    QPushButton *btn=new QPushButton;
    //2.1 显示按钮
    //2.1.1方法:使用show以顶层的方式弹出窗口或控件(新开辟窗口进行显示)
    //btn->show();
    //2.1.2 方法:让窗口或控件依赖在父窗口中(mywidget窗口)
    btn->setParent(this);
    //2.2显示按钮上文本
    btn->setText("第一个按钮");
    //(3)创建第二个按钮:
    //这种方法创建,会按照控件的大小生成窗口,需要重置窗口大小
    QPushButton *btn2=new QPushButton("第二个按钮",this);
    //移动按钮
    btn2->move(100,100);
    //重置窗口大小
    resize(600,400);
    //设置窗口标题
    setWindowTitle("第一个窗口");
    //设置固定窗口大小
     setFixedSize(600,400);
    //设置按钮大小
     btn->resize(50,50);
     //(4)创建自定义按钮的对象
     MyPushButton *btn3=new MyPushButton;
     btn3->setText("自定义按钮");
     btn3->move(100,200);
     btn3->setParent(this);//设置到对象树中
}

myWidget::~myWidget()
{
}

在这里插入图片描述
在这里插入图片描述
  (5)验证对象树中的对象析构的顺序(先析构子对象再析构父对象——先析构自定义的按钮对象,在析构该对象的父对象,即窗口类对象)
在这里插入图片描述

4.3 QT中的坐标系

  以左上角为原点(0,0),X向右增加,Y向下增加
  对于嵌套窗口,其坐标是相对于其父窗口来说的

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt自定义模型中实现右击菜单并重命名节点名称,可以按照以下步骤进行: 1. 在自定义模型中重载data函数,返回Qt::ItemFlags,表示该节点是否可编辑和是否可选择。 例如: ```cpp Qt::ItemFlags MyTreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::NoItemFlags; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; } ``` 2. 在自定义模型中重载setData函数,接受三个参数:QModelIndex对象、QVariant对象和int类型的角色。在该函数中,根据角色判断是否为Qt::EditRole,如果是,则将QVariant对象的数据设置为该节点的新名称。 例如: ```cpp bool MyTreeModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (role == Qt::EditRole) { // 将节点的新名称设置为QVariant对象的数据 m_data[index] = value.toString(); // 发射dataChanged信号,表示数据已更改 emit dataChanged(index, index); return true; } return false; } ``` 3. 在自定义视图中重载mousePressEvent函数,接受QMouseEvent对象作为参数。在该函数中,判断是否为右键单击事件,如果是,则创建QMenu对象,并添加QAction对象,该QAction对象的triggered信号连接到一个槽函数,在该槽函数中发射edit命令。 例如: ```cpp void MyTreeView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { // 获取单击的索引 QModelIndex index = indexAt(event->pos()); // 创建QMenu QMenu *menu = new QMenu(this); // 添加QAction QAction *renameAction = new QAction(tr("Rename"), this); connect(renameAction, &QAction::triggered, this, &MyTreeView::renameItem); menu->addAction(renameAction); // 显示菜单 menu->popup(event->globalPos()); } QTreeView::mousePressEvent(event); } ``` 4. 在自定义视图中创建renameItem槽函数,在该函数中获取选中项的索引,然后调用edit函数,并传递Qt::EditRole作为参数,以便启动编辑模式。 例如: ```cpp void MyTreeView::renameItem() { // 获取选中项的索引 QModelIndex index = currentIndex(); // 启动编辑模式 edit(index, Qt::EditRole); } ``` 现在,当用户右键单击视图中的节点时,将显示一个菜单,其中包含一个重命名操作。当用户单击重命名操作时,将启动编辑模式,并使用setData函数将新名称设置为节点的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值