【问题标题】:How to make a subchild to a child in QTreeWidget?如何在 QTreeWidget 中为子代创建子代?
【发布时间】:2014-08-30 20:29:16
【问题描述】:

我想这样做,以便我可以将第三级(子子级)扩展到顶级项目(根)下的子级。我所能做的就是让多个孩子成为一个根。

这是在我的 .cpp 中

    QStringList string1, string2;
    string1 << "xxxxxxxx" << "xxxxxxxxxxx";
    string2 << "yyyyyy" << "yy";

    m_treeWidget->insertTopLevelItem(0, new QTreeWidgetItem(string1));
    m_treeWidget->insertTopLevelItem(1, new QTreeWidgetItem(string2));


    //here I add a child
    AddChild(m_treeWidget->topLevelItem(0),"hello","world", m_treeWidget);

    //here I make two attempts to make a sub child
    AddChild(m_treeWidget->itemBelow(m_treeWidget->topLevelItem(0)),"hello_sub1","world_sub1", m_treeWidget);
    AddChild(m_treeWidget->itemAt(0,0),"hello_sub2","world_sub2", m_treeWidget);

以下是我在同一个 .cpp 文件中的添加子方法:

    void Dialog::AddChild (QTreeWidgetItem *parent, QString name, QString Description, QTreeWidget* treeWidget)
    {
         QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
         item->setText(0,name);
         item->setText(1, Description);
         parent->addChild(item);
    }

【问题讨论】:

    标签: c++ qt qtreewidget qtreewidgetitem


    【解决方案1】:

    其实我可以用另一种方式解决它...

    在.cpp中:

        //Initialize the QTreeWidget with 2 columns
    
        QTreeWidget m_treeWidget = new QTreeWidget();
        m_treeWidget->setColumnCount(2);
    
        //these are the method calls:
    
        AddRoot("Root1_Column1", "Root2_Column2", m_treeWidget);
        AddRoot("Root2_Column1", "Root2_Column2", m_treeWidget);
    
        //topLevelItem(0) makes it a child of the first root... topLevelItem(1) makes it a child of the second root
        AddChild(m_treeWidget->topLevelItem(0),"Child1_Column1","Child1_Column2"); 
        AddChild(m_treeWidget->topLevelItem(1),"Child2_Column1","Child2_Column2");
    
        AddSubChild(m_treeWidget->itemBelow(m_treeWidget->topLevelItem(0)),"SubChild_Column1", "SubChild_Column2");
    

    这些是我在同一个 .cpp 文件中使用的方法:

        void Dialog::AddRoot (QString name, QString Description, QTreeWidget* treeWidget)
        {
           QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
           item->setText(0,name);
           item->setText(1,Description);
           item->setExpanded(true); //expand automatically
           treeWidget->addTopLevelItem(item);
        }
    
        void Dialog::AddChild (QTreeWidgetItem *parent, QString name, QString Description)
        {
           QTreeWidgetItem *item = new QTreeWidgetItem();
           item->setText(0,name);
           item->setText(1, Description);
           parent->addChild(item);
        }
    
        void Dialog::AddSubChild (QTreeWidgetItem *parent, QString name, QString Description)
        {
           QTreeWidgetItem *item = new QTreeWidgetItem();
           item->setText(0,name);
           item->setText(1, Description);
           parent->addChild(item);
        }
    

    【讨论】:

    • 这不是好的编码风格,因为你有很多重复的代码。 AddChild 和 AddSubChild 甚至是相同的(逻辑和在您的代码中)。
    【解决方案2】:

    为了创建树层次结构,您可以使用QTreeWidgetItem 的API,尤其是它的构造函数。构造函数可以接受QTreeWidgetQTreeWidgetItem 作为父对象。在第一种情况下,顶级项目将添加到树小部件中,在第二种情况下 - 另一个项目的子项目。此 API 更易于使用,因为您不需要将项目显式附加到树小部件。下面是实现这个想法的示例代码:

    QStringList string1, string2;
    string1 << "xxxxxxxx" << "xxxxxxxxxxx";
    string2 << "yyyyyy" << "yy";
    
    QTreeWidget tv;
    
    // The top level items
    QTreeWidgetItem *top1 = new QTreeWidgetItem(&tv, string1);
    QTreeWidgetItem *top2 = new QTreeWidgetItem(&tv, string2);
    
    // A child item.
    QTreeWidgetItem *child1 =
                   new QTreeWidgetItem(top1, QStringList() << "Hello" << "World");
    
    // The grandchildren.
    new QTreeWidgetItem(child1, QStringList() << "Hello_sub1" << "World_sub1");
    new QTreeWidgetItem(child1, QStringList() << "Hello_sub2" << "World_sub2");
    

    【讨论】:

    • 谢谢,我花了一分钟才找到您正在使用的 API 中的哪些构造函数,但它们在这里(供读者将来参考): QTreeWidgetItem ( QTreeWidget * parent, int type = Type ) QTreeWidgetItem ( QTreeWidgetItem * parent, int type = Type )
    • 但我不得不去掉 & 标志。你为什么用这些?
    • 因为在我的示例中 tv 是一个值,而不是一个指针。我得记下它的地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多