QTreeWidget的一个例子,C++语法和item迭代循环都比较巧妙

学习一下,据说QTreeWidget简单好用,不需要单独设置Model和View,更没有delegate。Signal和Slot应该可以正常使用(未验证,以后补充)。

#include <QtGui/QApplication>
#include <QTreeWidget>
#include <QDebug>

// 定义结构体,只包括四个指针
typedef struct {
    char * sect_id, * title, * page_num;
    char * parent_id;
} SectionInfo;  

// 注意1,靠内容(最后一项)来设置上下级关系
// 注意2,它们不是按顺序排列的
SectionInfo directory[] = {
    {"Chapter 1",     "The Prehistory of C++",          "19",   ""},
    {"Chapter 2",     "C with Classes",                 "27",   ""},  

    {"Section 1.1",   "Simula and Distributed Systems", "19",   "Chapter 1"},
    {"Section 1.2",   "C and Systems Programming",      "22",   "Chapter 1"},  

    {"Section 2.4",   "Run-Time Efficiency",                "32",   "Chapter 2"},
    {"Section 2.4.1", "Inlining",                       "33",   "Section 2.4"},
};  

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTreeWidget * treeWidget = new QTreeWidget();
    // 设置列数(赤裸裸简单规定多少列的情况不多见啊)
    treeWidget->setColumnCount(3);
    // 设置表头
    QStringList headers;
    headers << "Section Number" << "Title" << "Page Number";
    treeWidget->setHeaderLabels(headers);                       

    // 循环一共执行六次
    for (int i=0; i<sizeof(directory)/sizeof(directory[0]);  i++) {
        SectionInfo info = directory[i]; // 给C++结构体赋值,还挺巧妙的
        QTreeWidgetItem * item=NULL;
        if (strcmp(info.parent_id, "")==0 ){
            item = new QTreeWidgetItem(treeWidget); // 设置一行依附于整体
        }else{
            QString parent_id(info.parent_id); // 取得当前行父节点的文字,用于比较
            QTreeWidgetItemIterator  it (treeWidget); // 取得整体treeWidget的迭代子项,注意是一行一行迭代
            // 直到i=4,才会进入while循环,0和1不会进入else,2和3第一次比较就不成立,所以不会进入while
            while ( (*it)->text(0) != parent_id) { // text(0)是QTreeWidgetItem的函数,即第零列的文字
                qDebug() << i << "  " << (*it)->text(0);
                ++it;
            }
            item = new QTreeWidgetItem( *it ); // 把最后一行空迭代子项变成一行,并把找到的节点设为父节点 good
        }
        // 有了item及可以设置内容了
        if ( item) {
            item->setText(0, info.sect_id);
            item->setText(1, info.title  );
            item->setText(2, info.page_num);
        }
    }
    treeWidget->resize(400,200);
    treeWidget->show();
    return app.exec();
}  

参考:

http://book.51cto.com/art/201207/347905.htm

时间: 2024-11-08 09:12:38

QTreeWidget的一个例子,C++语法和item迭代循环都比较巧妙的相关文章

iOS开发-OC语言 (六)点语法和@property

点语法和@property 知识点 1.setter/getter函数 2.点语法 [email protected]语法和属性 ======================================== 一.setter和getter函数 1.setter和getter函数的作用 setter  方法:   修改对象的字段/实例变量 getter 方法:   读取对象的字段/实例变量 setter 方法: 可以带有多个参数,可以同时给多个变量赋值 getter方法: 不带参数,只能返回一

OC第四节 ——点语法和@property

一.setter和getter函数     1.回忆:如何访问对象中的成员变量    2.setter和getter函数的作用            setter  方法:   修改对象的字段/实例变量            getter 方法:   读取对象的字段/实例变量                        setter 方法: 可以带有多个参数,可以同时给多个变量赋值 getter方法: 不带参数,只能返回一个变量的值. 3.setter和getter如何命名          

Razor语法和Razor引擎大全

一.Razor语法 1.Razor的标识符 解释:@字符被定义为Razor服务器代码块的标识符,后面的表示是服务器代码了.web form中使用<%%>中写服务器代码一个道理.在vs工具里面提供了代码着色和智能感应的功能. @{ string userName = "启超"; <span>我的名字叫:@userName</span> <span>我的出生日期:@DateTime.Now.ToString("yyyy-MM-dd&

运维工具Ansible浅谈playbook讲解以及YAML语法和JSON语法的互化

引言:运维发展到今天已经远远不是传统的运维做一些重复性的枯燥工作,面对海量爆发的访问量,传统的运维已经很吃力,比如让你装三五台机器的系统,这个so easy,那要是安装几百上千台呢,还easy吗.我要安装nginx服务,并提供好相应的端口转发机制以及location资源访问机制,但是有多发十几台这样的机制,并且每台机器转发机制都不相同,这个对我们来说是一个不小的挑战,因此运维进入了自动化时代,自动化运维就显得重要了.因此本文就是围绕自动化运维工具Ansible来展开的. 一,为什么要使用Ansi

Markdown 语法和 MWeb 写作使用说明(个人留存)

本人使用的是 MWeb Lite 工具,Mac 版 . # Markdown 语法和 MWeb 写作使用说明 ## Markdown 的设计哲学 > Markdown 的目標是實現「易讀易寫」. > 不過最需要強調的便是它的可讀性.一份使用 Markdown 格式撰寫的文件應該可以直接以純文字發佈,並且看起來不會像是由許多標籤或是格式指令所構成. > Markdown 的語法有個主要的目的:用來作為一種網路內容的*寫作*用語言. <!-- more --> ## 本文约定 如

iOS 中 #error宏 的使用的一个例子

头文件中如下定义宏: /** * @brief 默认空间名(必填项) */ #error 必填项 #define DEFAULT_BUCKET @"" /** * @brief 默认表单API功能密钥 (必填项) */ #error 必填项 #define DEFAULT_PASSCODE @"" 类的实现中使用: self.bucket = DEFAULT_BUCKET; self.passcode = DEFAULT_PASSCODE; 这样,如果没有初始化这两

一个例子理解threadLocal用法

ThreadLocal可以使对象达到线程隔离的目的.话不多说直接上代码: /** * 一个例子理解threadLocal * * 一个单例模式的类 */ public class SingleThreadLocalTest { private static SingleThreadLocalTest single = new SingleThreadLocalTest(); private ThreadLocal<String> threadLocal = new ThreadLocal<

subsys_initcall宏定义的一个例子,acpi/bus.c里面。

static int __init acpi_init(void) { int result; if (acpi_disabled) { printk(KERN_INFO PREFIX "Interpreter disabled.\n"); return -ENODEV; } acpi_kobj = kobject_create_and_add("acpi", firmware_kobj); if (!acpi_kobj) { printk(KERN_WARNING

js的prototype扩展的一个例子,模仿C#的StringBuilder功能,数组组合字符串,效率大于+拼凑

function StringBuilder() { this._strings_ = new Array;}StringBuilder.prototype.append = function (str) { this._strings_.push(str);};StringBuilder.prototype.toString = function () { return this._strings_.join("");}; js的prototype扩展的一个例子,模仿C#的Strin