首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Qt中创建部分可编辑的树模型

在Qt中创建部分可编辑的树模型,您可以按照以下步骤进行操作:

  1. 首先,需要创建一个自定义的模型类,继承自QAbstractItemModel。可以命名为CustomTreeModel
  2. CustomTreeModel类中,重写以下几个虚函数来实现树模型的基本功能:
    • rowCount():返回指定父节点下的子节点数量。
    • columnCount():返回树模型的列数。
    • data():返回指定索引处的数据。
    • setData():设置指定索引处的数据。
    • flags():返回指定索引的标志,用于指定节点的可编辑性。
    • index():返回具有给定行列号的模型索引。
    • parent():返回指定索引的父节点索引。
  • CustomTreeModel类中,需要创建一个自定义的节点类,继承自QObject。可以命名为TreeItemTreeItem类中需要包含节点的数据以及子节点的列表。
  • CustomTreeModel类的构造函数中,创建树模型的根节点,并填充树结构数据。
  • 在树模型中,可以通过重写flags()函数来指定节点的可编辑性。使用Qt::ItemIsEditable标志来指定节点可编辑。
  • 若要实现部分可编辑的树模型,需要根据实际情况在setData()函数中判断索引的位置和节点的数据类型,决定是否允许编辑。

以下是一个示例代码:

代码语言:txt
复制
#include <QAbstractItemModel>
#include <QObject>

class TreeItem : public QObject
{
    Q_OBJECT
public:
    explicit TreeItem(const QString& data, TreeItem* parent = nullptr)
        : QObject(parent), m_data(data), m_parent(parent)
    {}
    
    ~TreeItem()
    {
        qDeleteAll(m_children);
    }
    
    void appendChild(TreeItem* child)
    {
        m_children.append(child);
    }
    
    TreeItem* child(int row)
    {
        return m_children.value(row);
    }
    
    int childCount() const
    {
        return m_children.count();
    }
    
    int row() const
    {
        if (m_parent)
            return m_parent->m_children.indexOf(const_cast<TreeItem*>(this));
        
        return 0;
    }
    
    QVariant data() const
    {
        return m_data;
    }
    
private:
    QString m_data;
    TreeItem* m_parent;
    QList<TreeItem*> m_children;
};

class CustomTreeModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    explicit CustomTreeModel(QObject* parent = nullptr)
        : QAbstractItemModel(parent)
    {
        // 创建根节点和子节点
        TreeItem* rootItem = new TreeItem("Root");
        TreeItem* childItem1 = new TreeItem("Child 1", rootItem);
        TreeItem* childItem2 = new TreeItem("Child 2", rootItem);
        TreeItem* grandchildItem1 = new TreeItem("Grandchild 1", childItem2);
        
        // 将子节点添加到根节点
        rootItem->appendChild(childItem1);
        rootItem->appendChild(childItem2);
        childItem2->appendChild(grandchildItem1);
        
        m_rootItem = rootItem;
    }
    
    ~CustomTreeModel()
    {
        delete m_rootItem;
    }
    
    QModelIndex index(int row, int column, const QModelIndex& parent) const override
    {
        if (!hasIndex(row, column, parent))
            return QModelIndex();
        
        TreeItem* parentItem = getItem(parent);
        TreeItem* childItem = parentItem->child(row);
        
        if (childItem)
            return createIndex(row, column, childItem);
        else
            return QModelIndex();
    }
    
    QModelIndex parent(const QModelIndex& index) const override
    {
        if (!index.isValid())
            return QModelIndex();
        
        TreeItem* childItem = getItem(index);
        TreeItem* parentItem = childItem->parent();
        
        if (parentItem == m_rootItem)
            return QModelIndex();
        
        return createIndex(parentItem->row(), 0, parentItem);
    }
    
    int rowCount(const QModelIndex& parent = QModelIndex()) const override
    {
        TreeItem* parentItem = getItem(parent);
        
        return parentItem->childCount();
    }
    
    int columnCount(const QModelIndex& parent = QModelIndex()) const override
    {
        Q_UNUSED(parent);
        
        return 1; // 此处只有一列,可以根据实际需要调整
    }
    
    QVariant data(const QModelIndex& index, int role) const override
    {
        if (!index.isValid())
            return QVariant();
        
        if (role != Qt::DisplayRole && role != Qt::EditRole)
            return QVariant();
        
        TreeItem* item = getItem(index);
        
        return item->data();
    }
    
    bool setData(const QModelIndex& index, const QVariant& value, int role) override
    {
        if (role != Qt::EditRole)
            return false;
        
        TreeItem* item = getItem(index);
        
        if (item->data() != value) {
            // 根据实际情况进行数据验证和更新
            
            // 更新数据
            item->setData(value);
            
            // 发送数据更新信号
            emit dataChanged(index, index, QVector<int>() << role);
            
            return true;
        }
        
        return false;
    }
    
    Qt::ItemFlags flags(const QModelIndex& index) const override
    {
        Qt::ItemFlags defaultFlags = QAbstractItemModel::flags(index);
        
        if (index.isValid())
            return defaultFlags | Qt::ItemIsEditable;
        
        return defaultFlags;
    }
    
private:
    TreeItem* getItem(const QModelIndex& index) const
    {
        if (index.isValid()) {
            TreeItem* item = static_cast<TreeItem*>(index.internalPointer());
            
            if (item)
                return item;
        }
        
        return m_rootItem;
    }
    
    TreeItem* m_rootItem;
};

此示例代码中的树模型是一个单列的模型,可以根据实际需要进行调整。您可以将其集成到Qt的应用程序中,然后使用QTreeViewQListView来显示树结构,并通过用户交互来编辑模型中的数据。

注意:示例代码中没有涉及腾讯云相关产品的信息,如果需要了解腾讯云在云计算领域的产品,可以参考腾讯云官方文档或咨询腾讯云官方客服。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在Django中创建新的模型实例

在 Django 中,创建新的模型实例可以通过以下几个步骤进行,通常包括定义模型、创建模型实例、保存数据到数据库,以及访问和操作这些实例。...1、问题背景在 Django 中,可以使用 models.Model 类来创建模型,并使用 create() 方法来创建新的模型实例。但是,在某些情况下,可能会遇到无法创建新实例的问题。...2、解决方案这个问题的原因是,在 Customer 模型的 create() 方法中,并没有调用 save() 方法来将新的客户实例保存到数据库中。...因此,虽然我们创建了新的客户实例,但它并没有实际地存储在数据库中。...最终我们可以根据实际需求选择不同的方法创建和操作模型实例。

11910

C++ Qt开发:QItemDelegate自定义代理组件

在Qt中,QStyledItemDelegate 类是用于创建自定义表格视图(如QTableView和QTableWidget)的委托类,允许你自定义表格中每个单元格的外观和交互。...1.1 概述代理类代理类的作用是用来实现组件重写的,例如TableView中默认是可编辑的,之所以可编辑是因为Qt默认为我们重写了QLineEdit编辑框实现的,也可理解为将组件嵌入到了表格中,实现了对表格的编辑功能...在自定义代理中QAbstractItemDelegate是所有代理类的抽象基类,它用于创建自定义的项委托。提供了一个基本的框架,使得可以定制如何在视图中绘制和编辑数据项。...并实现这些函数,读者可创建一个定制的项委托,用于控制数据项在视图中的外观和交互行为。...接着就是对该接口的重写了,此处重写代码spindelegate.cpp如下所示,其关键位置的解释可参考注释部分。

1K11
  • Qt Model View 简便类(一)

    表格、列表和树型窗口部件是 GUI 开发中经常会用到的窗口部件。传统的方式是窗口部件本身包含用于存储数据的内置容器。这种方式非常符合直观感受,然而,在许多复杂的应用中,这将导致数据的同步问题。...Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。...Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。...对于Qt的Model /View我们可以简单的划分为3种使用级别: ①Model /View的简便类 ②Model /View的预定义模型 ③Model /View的自定义模型 简便类:如QListWidget...运行环境:ubuntu、 Qt5.5.1 例子是C++ GUI Qt4 改成的Qt5,通过一个对话框显示用户可以编辑的(x,y)坐标。

    1.4K40

    C++ Qt开发:StringListModel字符串列表映射组件

    QStringListModel 是 Qt 中用于处理字符串列表数据的模型类之一,它是 QAbstractListModel 的子类,用于在 Qt 的视图类(如 QListView、QComboBox...该组件是用于在Qt中快速显示字符串列表的便捷模型类。...该组件通常会配合ListView一起使用,例如将ListView组件与Model模型绑定,当ListView组件内有数据更新时,就可以利用映射将数据模型中的数值以字符串格式提取出来,同理也可实现将字符串赋值到指定的...接着,创建了一个 QStringListModel 对象 model 并使用 setStringList 方法将先前创建的字符串列表导入模型中。...组将将被初始化为城市地址,如下图所示; 1.2 添加与插入 如下代码演示了如何在 MainWindow 中通过按钮的点击事件向 QStringListModel 中添加或插入数据。

    28010

    PyQT模块、类、控件介绍

    该模块使得Qt GUI库和OpenGL库无缝集成。 QtXmlPatterns模块 所包含的类实现了对XML和自定义数据模型的Xquery与XPath的支持。...QtDesigner模块 所包含的类允许使用PyQt扩展Qt Designer。 Qt模块 将上面模块中的类综合到一个单一的模块中。...uic模块 所包含的类用来处理.ui文件,该文件由Qt Designer创建,用于描述整个或者部分用户界面。它可以将.ui文件编译为.py文件,以便其他Python程序调用。...PyQT主要类 QObject类 在类层次结构中是顶部类(Top Class),它是所有PyQt对象的基类。 QPaintDevice类 所有可绘制的对象的基类。...QFrame类 有框架的窗口控件的基类。它也被用来直接创建没有任何内容的简单框架,但是通常要用到QHBox或QVBox,因为它们可以自动布置放到框架中的窗口控件。

    64331

    【QT】:QMainWindow 窗口

    )、⼀个状态栏(Status Bar)和一个中心部件(Central Widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。...QMenuBar 脱离了 Qt 的对象树,意味着后续就无法对这个对象进行释放了。...在 Qt 中,并没有专门的菜单项类(QMenuBarItem),可以通过 QAction 类,抽象出公共的动作,如在菜单中添加菜单项。...在状态栏中可以显示的消息类型有: 实时消息:如当前程序状态 永久消息:如程序版本号,机构名称 进度消息:如进度条提示,百分百提示 一、状态栏的创建 状态栏的创建是通过 QMainWindow 类提供的...窗口布局 之前我们在 [QT 控件](【QT】控件 – 多元素类 | 容器类 | 布局类-CSDN博客)里已经讲过了大部分的布局类,现在我们来了解来自 QMainWindow 的窗口类布局,如下: 浮动窗口

    8310

    【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

    accessibleName 设置 widget 的可访问名称,辅助技术(如屏幕阅读器)可以获取到这个名称。...在 Qt Designer 中设置按钮的光标 (1)在界面中创建一个按钮,然后直接在右侧属性编辑区修改 cursor 属性为 “打开手势” (2)运行程序 鼠标悬停到按钮上之后,就可以看到光标的变化。...自定义鼠标光标 Qt 自带的光标形状有限,我们也可以自己找个图片,做成鼠标的光标,比如我们这里用我们上面图标那用到的宝可梦当鼠标光标 (1)用下面说到的,创建 qrc 的方法,来创建 qrc 资源文件...在 Qt Designer 中设置字体属性 1)在界面上创建一个 label 2)在右侧的属性编辑区,设置该 label 的 font 相关属性在这里调整上述属性,Qt Designer 能够对界面的属性设置支持...原因: 在构造方法中,Widget 刚刚创建出来,还没有加入到对象树中,此时也就不具备 Window frame。

    31110

    C++ Qt开发:Tab与Tree组件实现分页菜单

    ,如下图我们分别创建了四个选择夹,并实现了分页展示的效果; 1.2 TreeWidget QTreeWidget 是 Qt 中的一个用于显示树形结构的小部件。...列显示: 可以在每个节点下显示多列数据,每列可以包含不同的信息,这使得 QTreeWidget 可以用于显示表格型数据。 编辑节点: 用户可以编辑节点的数据,允许动态修改树的内容。...信号与槽: QTreeWidget 发送各种信号,如 itemClicked、itemDoubleClicked 等,以便在用户与树交互时执行相应的操作。...虽然TreeWidget组件可以实现多节点的增删改查功能,但在一般的应用场景中基本上只使用一层结构即可解决大部分开发需求,TreeWidget组件通常可配合TabWidget组件实现类似于树形菜单栏的功能...首先在Qt的UI编辑界面左侧加入TreeWidget组件,右侧加入TabWidget组件,将页面中的TabWidget组件增加指定页,整体页面布局如下所示; 要实现对页面的美化只需要在代码中进行调整,在

    71121

    C++ Qt开发:Tab与Tree组件实现分页菜单

    ,如下图我们分别创建了四个选择夹,并实现了分页展示的效果;1.2 TreeWidgetQTreeWidget 是 Qt 中的一个用于显示树形结构的小部件。...列显示: 可以在每个节点下显示多列数据,每列可以包含不同的信息,这使得 QTreeWidget 可以用于显示表格型数据。编辑节点: 用户可以编辑节点的数据,允许动态修改树的内容。...信号与槽: QTreeWidget 发送各种信号,如 itemClicked、itemDoubleClicked 等,以便在用户与树交互时执行相应的操作。...虽然TreeWidget组件可以实现多节点的增删改查功能,但在一般的应用场景中基本上只使用一层结构即可解决大部分开发需求,TreeWidget组件通常可配合TabWidget组件实现类似于树形菜单栏的功能...首先在Qt的UI编辑界面左侧加入TreeWidget组件,右侧加入TabWidget组件,将页面中的TabWidget组件增加指定页,整体页面布局如下所示;要实现对页面的美化只需要在代码中进行调整,在MainWindow

    51721

    【QT】编写第一个 QT 程序 & 对象树 & Qt 编程事项 & 内存泄露问题

    认识对象模型(对象树) 2.1 什么是对象树 在 Qt 中创建很多对象的时候会提供一个 Parent对象指针,下面来解释这个 parent 到底是干什么的。...Qt 引入对象树的概念,在一定程度上解决了内存问题。 当一个 QObject 对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。...Qt 对象树如下: 2.2 验证对象树 首先我们自定义一个label类,并在析构部分打上日志,如下步骤: ① 选中工程名,鼠标右键------->"add new..."...通过 setText 来设置的,参数 QString(Qt 中把 C++ 里的很多容器类,进行了重新封装,历史原因) 内存泄露/文件资源泄露 对象树: Qt 中通过对象树,来统一的释放界面的控件对象,Qt...不仅仅是析构函数, 达到功能扩展目的 乱码问题 和 字符集~ MySQL(很多地方都涉及到) 如何在 Qt 中打印日志,作为调试信息使用 cout 固然可以, 但是并不是上策(字符编码处理的不好,也不方便统一进行关闭

    13910

    ROS机器人操作系统资料与资讯(2018年12月)

    这些标准的建立提供了一种有效且方便的方法来传播算法和模型的实现,否则这些算法和模型的实现无法实现,这允许在机器人技术中复制和比较结果,推进技术和科学。...主题: 机器人技术的开源中间件和框架 教育领域的开源 开源项目 机器人开放标准 开源工业方法的描述 打开硬件 基于开源的开发模型 客座编辑: FranciscoMartínRico先生 -...令人兴奋的部分是我们可以做很多事情,而且它没有那么遥远!很高兴看到3M,我们的主持人,展示了基于ROS的演示,并尽其所能介绍概念以及如何在解决方案开发方面提供帮助。...来自ROS Discourse General 亲爱的机器人专家, 我想与您分享我们的新库,它们可以帮助您改善机器人行为。 行为树类似于分层有限状态机,但它们更直观和可维护。...干杯 Davide Faconti 承认 该软件是作为MOOD2Be项目的一部分创建的 ,它是在Eurecat开发的。

    57810

    Qt 学习记录

    ② 操作符重载函数参数 标识重载的 () 操作符的参数,没有参数时,这部分可以省略。参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递。...③ 可修改标示符 mutable,这部分可以省略。按值传递函数对象参数时,加上 mutable 修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。...status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。...()函数设定工具栏的可移动性: setMoveable(false)//工具条不可移动, 只能停靠在初始化的位置上 代码承接上面菜单栏部分代码 //创建工具栏 可以多个 QToolBar * toolBar...你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。

    7.2K50

    【C++】Qt:QML介绍与入门示例

    Qt Quick与QML介绍 Qt Quick是一个用于构建现代、高效、可扩展用户界面的框架。它是Qt开发框架的一部分,旨在通过声明性语法和JavaScript绑定来简化用户界面的设计和实现。...组件化和重用:Qt Quick鼓励将用户界面拆分为可重用的组件。这样可以提高开发效率,并促进界面元素的一致性和可维护性。 属性绑定:通过属性绑定,您可以在QML中声明对象之间的依赖关系。...可扩展性:Qt Quick是可扩展的,允许您根据需要编写自定义的QML组件和插件。这样可以轻松地扩展Qt Quick框架,并与其他Qt模块(如C++部分)进行交互。...Qt Quick提供了丰富的控件库和工具,以及强大的功能来处理用户输入、布局管理和数据模型。它广泛应用于跨平台开发,包括桌面应用程序、移动应用程序以及嵌入式设备上的图形界面。 2....QML与C++交互示例 创建一个空的Qt Quick程序。

    49810

    【QT】QT入门

    ,提供了使用 QML 创建用户界面所需的一切,包括可视化、交互、动画、模型、视图、粒子效果以及着色效果等 (2)选择项目路径 就是选择文件保存的位置,注意这个位置一定要全英文 (3)选择构建系统...)就可以选择直接传到仓库中,如果没有或者不想传就选择None 红框中是自动生成的文件 (8)创建完毕 其实QT程序的编写窗口是很明了的,感觉跟VS的布局也差不了多少 二、QT的Hello World...在QT中创建很多对象的时候会提供一个Parent对象指针,QObject是以对象树的形式组织起来的,,当创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是...parent,也就是父类指针 在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children列表 当父对象析构的时候,这个列表中的所有对象也会被析构...当我们删除子对象时,包括它的子对象们会自动从其父对象列表中删除 QT引入对象树的概念在一定程度上解决了内存问题 当一个QObject对象在堆上创建的时候,QT会同时为其创建一个对象树,不过对象树种对象的顺序是没有定义的

    43610

    Qt5实战第一篇:Qt5入门与环境搭建

    Qt5提供了丰富的API,以及一套强大的工具,使得开发者能够高效地创建应用程序。本文将详细介绍Qt5的基本概念、优势以及如何在不同平台上安装和配置Qt5开发环境。...在“系统变量”中找到PATH变量,点击“编辑”,然后将Qt5的bin目录路径添加到变量值中。验证安装:打开命令提示符或PowerShell,输入qmake -v来验证Qt5是否正确安装。...在弹出的对话框中,输入项目名称、项目位置等信息,然后点击“Next”。在接下来的对话框中,选择构建套件(通常默认即可),然后点击“Next”。在最后的对话框中,点击“Finish”以创建项目。...4.编写代码:在Qt Creator的右侧面板中,双击mainwindow.cpp以打开代码编辑器。在MainWindow类的构造函数中,添加信号与槽的连接代码。...通过本文的介绍,你已经了解了Qt5的基本概念、优势以及如何在不同平台上安装和配置Qt5开发环境。接下来,我们会继续学习Qt5的其他功能,并创建更加复杂和有趣的应用程序。

    29410

    『PyQt5-基础篇』| 04 Qt Designer的初步快速了解

    1 Qt Designer入口之前文章设置好了Qt Designer工具;现在直接在Pycharm中打开;路径为:工具-External Tools-Qt Designer图片图片2 Qt Designer-Widget...Box一般情况下,我们创建一个应用程序选的是Main Window;选择后进入到Qt Designer的设计界面:图片2.1 窗口部件盒(Widget Box)最左侧的就是Widget Box;图片所有同类的控件会在一起显示...;2.2 Layouts布局Layouts是Qt Designer支持的4中布局;图片布局说明 示例Vertical Layout 竖直布局图片Horizontal Layout水平布局 图片Grid...Check Box多选框图片Command Link Button命令链接按钮图片Dialog Button Box对话框按钮图片2.5 Item Views(Model-Based)item视图(基于模型...)item小部件(基于item);控件说明 List Widget 列表小部件Tree Widget树小部件Table Widget 表格小部件 2.7 Containers容器控件说明 示例Group

    1.2K70

    Qt开发框架及特点

    Qt 是一个功能强大且灵活的跨平台 C++ 开发框架,广泛用于开发图形用户界面(GUI)应用程序以及非 GUI 程序(如命令行工具、服务器和嵌入式系统)。以下是 Qt 开发框架的主要组成部分及其特点。...1.Qt 的核心模块1.1Qt Core功能:提供核心的非 GUI 功能,包括事件循环、对象模型(信号与槽)、线程、文件 I/O、定时器等。特点:信号与槽机制:实现对象间的松耦合通信。...特点:提供高层次的数据库操作 API(如 QSqlQuery、QSqlTableModel)。支持事务处理和模型视图编程。...2.5Qt Charts功能:提供图表绘制功能,支持折线图、柱状图、饼图等。特点:易于集成到 Qt Widgets 和 Qt Quick 中。支持动态数据更新。...Qt Quick:适合现代 UI 开发,支持动画、触摸屏和硬件加速。3.4高效的开发工具Qt Creator:官方集成开发环境(IDE),支持代码编辑、调试、UI 设计和性能分析。

    10110

    【QT】:QT(介绍、下载安装、认识 QT Creator)

    强大的编辑器:Qt Creator 具有一些先进的编辑器功能,如语法高亮、代码折叠、智能提示、自动完成和代码重构。...集成的调试器:Qt Creator 内置了调试器,允许开发人员在代码中设置断点以及检查变量、堆栈和调用树等信息。...构建设置中可以对项目的版本、使用的Qt版本和编译步骤进行设置;编辑器设置中可以设置文件的默认编码;在代码风格设置中可以设置自己的代码风格。...Qt Quick 模块是开发 QML 应用的标准库,提供了使用 QML 创建用户界⾯所需的⼀切,包括可视化、交互、动画、模型、视图、粒子效果以及着色效果等。...public: Widget(QWidget *parent = nullptr); // Qt种引入了“对象树”机制(后期会讲解到),创建Qt对象,就可以将对象挂到对象树上,往对象树上挂的时候就需要指定

    1.6K11

    初学Qt(一)

    如果是一个小白,那么该如何学习Qt呢?接下来我从自己的学习经历中总结一下,希望对初学Qt的同志能有一点儿帮助。...此外它拥有大量的组件,以方便和加速开发过程,如它的IDE(集成开发环境)—— Qt Creator、Qt Designer、Qt Assistant等,还有很多,不一一列举。...在创建工程这块,我要说的是要了解Qt提供的一些模板:如左侧第一个默认的是应用程序,第二个是创建库模板。...开启PPT模式: Layouts:布局器,垂直、水平、栅格布局等方式 Buttons:各种按钮,单选按钮、多选按钮、对话框按钮等 Item Views:Qt Model/View的显示部分,列表、树、...总共三小部分: ①点击一个按钮,弹出一个标题为“闲鱼搜索”的通知对话框, 对话框为HTML样式的“Qt入门程序与Demo讲解!!!”。这个是通 过信号和槽实现的。

    1.8K20
    领券