界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)

这篇具有很好参考价值的文章主要介绍了界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

点击获取Qt Widget组件下载(Q技术交流:166830288)

树项类定义

该类提供包含多个数据的简单项,包括有关其父项和子项的信息:TreeItem

class TreeItem
{
public:
explicit TreeItem(const QList<QVariant> &data, TreeItem *parent = nullptr);
~TreeItem();

TreeItem *child(int number);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
bool insertChildren(int position, int count, int columns);
bool insertColumns(int position, int columns);
TreeItem *parent();
bool removeChildren(int position, int count);
bool removeColumns(int position, int columns);
int childNumber() const;
bool setData(int column, const QVariant &value);

private:
QList<TreeItem *> childItems;
QList<QVariant> itemData;
TreeItem *parentItem;
};

我们将 API 设计为类似于 QAbstractItemModel 提供的 API,为每个项目提供返回信息列数、读取和写入数据以及插入和删除列的函数。但是,我们通过提供处理“子”而不是“行”的函数来明确项目之间的关系。

每个项都包含一个指向子项的指针列表、一个指向其父项的指针,以及一个 QVariant 对象列表,这些对象对应于模型中给定行的列中保存的信息。

树项类实现

每个都由数据列表和一个可选的父项构造:TreeItem

TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
: itemData(data), parentItem(parent)
{}

最初,每个项目都没有子项。这些函数使用后面介绍的函数添加到项的内部成员中。childItemsinsertChildren()

析构函数确保在删除项本身时删除添加到项的每个子项:

TreeItem::~TreeItem()
{
qDeleteAll(childItems);
}

由于每个项目都存储指向其父项的指针,因此该函数很简单:parent()

TreeItem *TreeItem::parent()
{
return parentItem;
}

三个函数提供有关项的子项的信息。 从内部子项列表中返回特定的子项:child()

TreeItem *TreeItem::child(int number)
{
if (number < 0 || number >= childItems.size())
return nullptr;
return childItems.at(number);
}

该函数返回子项的总数:childCount()

int TreeItem::childCount() const
{
return childItems.count();
}

该函数用于确定子项在其父项的子项列表中的索引。它直接访问父级的成员以获取此信息:childNumber()childItems

int TreeItem::childNumber() const
{
if (parentItem)
return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
return 0;
}

根项没有父项;对于此项,我们返回零以与其他项保持一致。

该函数仅返回 QVariant 对象内部列表中的元素数:columnCount()itemData

int TreeItem::columnCount() const
{
return itemData.count();
}

使用函数检索数据,该函数访问列表中的相应元素:data()itemData

QVariant TreeItem::data(int column) const
{
if (column < 0 || column >= itemData.size())
return QVariant();
return itemData.at(column);
}

数据是使用函数设置的,该函数仅将有效列表索引的值存储在列表中,对应于模型中的列值:setData()itemData

bool TreeItem::setData(int column, const QVariant &value)
{
if (column < 0 || column >= itemData.size())
return false;

itemData[column] = value;
return true;
}

为了使模型的实现更容易,我们返回 true 以指示数据已成功设置。

可编辑模型通常需要调整大小,以便插入和删除行和列。在模型中给定模型索引下插入行会导致在相应的项中插入新的子项,由以下函数处理:insertChildren()

bool TreeItem::insertChildren(int position, int count, int columns)
{
if (position < 0 || position > childItems.size())
return false;

for (int row = 0; row < count; ++row) {
QList<QVariant> data(columns);
TreeItem *item = new TreeItem(data, this);
childItems.insert(position, item);
}

return true;
}

这可确保使用所需列数创建新项,并将其插入到内部列表中的有效位置。使用以下函数删除项目:childItemsremoveChildren()

bool TreeItem::removeChildren(int position, int count)
{
if (position < 0 || position + count > childItems.size())
return false;

for (int row = 0; row < count; ++row)
delete childItems.takeAt(position);

return true;
}

如上所述,用于插入和删除列的函数与用于插入和删除子项的函数使用方式不同,因为它们应该在树中的每个项上调用。我们通过在项目的每个子项上递归调用此函数来实现这一点:文章来源地址https://www.toymoban.com/news/detail-460842.html

bool TreeItem::insertColumns(int position, int columns)
{
if (position < 0 || position > itemData.size())
return false;

for (int column = 0; column < columns; ++column)
itemData.insert(position, QVariant());

for (TreeItem *child : std::as_const(childItems))
child->insertColumns(position, columns);

return true;
}

到了这里,关于界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在Ubuntu上编辑和运行C程序(新手入门)

    兜兜转转还是想再深入的学习C语言,因此打算制定一个学习C语言的计划来不断推荐学习C语言。欢迎各位志同道合的同志加入和交流 。 qq群·:829876251 目前而言C语言主要运用在底层模块(驱动、解码器、算法实现),服务器(后端服务器)、嵌入式设备(手机等电子产品上的软件

    2024年02月07日
    浏览(33)
  • 微服务框架Consul--新手入门

    Consul 是由 HashiCorp 开发的一款软件工具,提供了一组功能,用于服务发现、配置管理和网络基础设施自动化。它旨在帮助组织管理现代分布式和微服务架构系统的复杂性。以下是Consul的一些关键方面和功能: 服务发现:Consul 允许服务自行注册并以动态和自动化的方式发现其

    2024年02月07日
    浏览(44)
  • HLS新手入门教程

    HLS是一种高级综合技术,它允许开发人员使用高级语言(如C、C++和SystemC)来描述数字电路的行为和功能,然后将其转换为硬件电路实现。这种转换过程是自动完成的,因此开发人员无需手动编写硬件描述语言(HDL)。 HLS的主要目的是简化FPGA设计流程,提高设计效率和设计质

    2024年02月02日
    浏览(56)
  • 新手入门Jenkins自动化部署入门详细教程

    在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试; 或者前后端分离后,经常会修改接口,然后重新部署; 这些情况都会涉及到频繁的打包部署; 手动打包常规步骤: 1.提

    2024年02月13日
    浏览(52)
  • StarkNet新手入门教程:教你用bitget 钱包入门

    理想的Starknet (web3.bitget.com/zh/assets/starknet-wallet) 钱包取决于个人喜好,同时考虑安全性、用户友好性、帐户恢复选项和多通证支持等因素。尽管如此,无论您使用 Starknet (STRK) 的目的是持有还是交易,Bitget Wallet 都是您管理 STRK 以及其他以太坊和 Optimism 加密资产的理想钱包选择

    2024年03月12日
    浏览(51)
  • 【Jmeter】压力测试新手入门教程

    压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率;预估系统的承载能力,使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步骤,下面我带大家来使用一款压力测试工

    2024年04月15日
    浏览(52)
  • qt qtcreator qt+vs 编译器 关于QT、QT creator和编译器,新手入门必知的一些知识关于QT、QT creator和编译器,新手入门必知的一些知识_qt和qtcreator的区别_炫彩灵感的博客-CSDN博客

    对于一个新手而言,基本体会如下: Qt Creator Qt Creator优势 可以实现Ui和代码无缝切换。(VS不行) 对于汉字的支持更好 提示功能做的更好。 比如:#include等,敲出#inc即有提示。 qmake非常好用 项目管理更方便,可以添加pri之类的来管理子模块 Qt Creator劣势(IDE本身巨大劣势)

    2024年02月11日
    浏览(64)
  • Git 新手快速入门教程

    1. 何为版本控制 版本控制是一种记录文件变化的系统,可以跟踪文件的修改历史,并允许用户在不同版本之间进行比较、恢复或合并。它主要用于软件开发过程中管理代码的变更,但也可以应用于任何需要跟踪文件变更的场景。 版本控制系统(VCS)可以帮助团队协作开发,

    2024年04月26日
    浏览(59)
  • 电脑黑客技术新手入门,自学黑客技术入门教程

    最近经常有小伙伴联系我说要学黑客技术,当然目的各种各样,有的就是觉得黑客很酷,单纯想要学技术,还有的就是想找人帮忙攻击赌博网站或者监听别人的电话(以女朋友的电话居多),对于想要单纯学技术的朋友我很欢迎他们问我问题,但对于那些想做违法事情的人我

    2024年02月10日
    浏览(49)
  • Windows 驱动开发 新手入门(四)

    本系列所有文章 Windows 驱动开发 新手入门(一) Windows 驱动开发 新手入门(二) Windows 驱动开发 新手入门(三) Windows 驱动开发 新手入门(四) 本篇文章介绍一下设备对象,这是写驱动过滤的基础,比如键盘,串口等等的过滤。 PDO 是 Phsical Device Object 的缩写,直译就是物

    2023年04月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包