Qt (2) Introduction to UI controls and demonstration of optional tree controls

1. Introduction to UI Controls

insert image description here
insert image description here
insert image description here

Second, optional list control demonstration

Create a new widget simple application, open the .ui file, and drag the TreeWidget.
Edit the source code as follows: the main.cpp file does not move.

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTreeWidgetItem>

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    
    
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //
    void InitUi();
    void UpdateParentItem(QTreeWidgetItem * item);
public slots:
    void TreeItemChanged(QTreeWidgetItem * item, int column);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

//widget.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);
    setWindowTitle("世界高校排行榜");

    QString str = "高校名称";
    ui->treeWidget->setHeaderLabel(str);

    //初始化treeweidgets
    InitUi();
    connect(ui->treeWidget,
            SIGNAL(itemChanged(QTreeWidgetItem *,int)),
            this,
            SLOT(TreeItemChanged(QTreeWidgetItem *,int)));
}


void Widget::InitUi()
{
    
    
    ui->treeWidget->clear();

     //世界高校排行榜
    QTreeWidgetItem* group1 = new QTreeWidgetItem(ui->treeWidget);
    group1->setText(0,"世界高校排行榜");
    group1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    group1->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemx1 = new QTreeWidgetItem(group1);
    subItemx1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemx1->setText(0,"麻省理工学院");
    subItemx1->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemx2 = new QTreeWidgetItem(group1);
    subItemx2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemx2->setText(0,"清华大学");
    subItemx2->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemx3 = new QTreeWidgetItem(group1);
    subItemx3->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemx3->setText(0,"牛津大学");
    subItemx3->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemx4 = new QTreeWidgetItem(group1);
    subItemx4->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemx4->setText(0,"哈弗大学");
    subItemx4->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemx5 = new QTreeWidgetItem(group1);
    subItemx5->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemx5->setText(0,"剑桥大学");
    subItemx5->setCheckState(0,Qt::Unchecked);


    //中国高校排行榜
    QTreeWidgetItem* group2 = new QTreeWidgetItem(ui->treeWidget);
    group2->setText(0,"中国高校排行榜");
    group2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    group2->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemy1 = new QTreeWidgetItem(group2);
    subItemy1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemy1->setText(0,"清华大学");
    subItemy1->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemy2 = new QTreeWidgetItem(group2);
    subItemy2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemy2->setText(0,"北京大学");
    subItemy2->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemy3 = new QTreeWidgetItem(group2);
    subItemy3->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemy3->setText(0,"复旦大学");
    subItemy3->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemy4 = new QTreeWidgetItem(group2);
    subItemy4->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemy4->setText(0,"武汉大学");
    subItemy4->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItemy5 = new QTreeWidgetItem(group2);
    subItemy5->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItemy5->setText(0,"四川大学");
    subItemy5->setCheckState(0,Qt::Unchecked);
}


void Widget::UpdateParentItem(QTreeWidgetItem * item)
{
    
    
    QTreeWidgetItem* parent = item->parent();
    if(parent ==NULL)return;

    //选择子节点个数
    int selectCount = 0;
    int childCount = parent->childCount();
    for (int i=0;i<childCount;i++) {
    
    
        QTreeWidgetItem* childItem = parent->child(i);
        if(childItem->checkState(0) == Qt::Checked){
    
    
            selectCount++;
        }
    }

    if(selectCount<=0){
    
    
        parent->setCheckState(0,Qt::Unchecked);          //选中
    }else if(selectCount>0 && selectCount<childCount){
    
    
        parent->setCheckState(0,Qt::PartiallyChecked);   //部分选中
    }else if(selectCount==childCount){
    
    
        parent->setCheckState(0,Qt::Checked);            //未选中
    }
}


void Widget::TreeItemChanged(QTreeWidgetItem * item, int column)
{
    
    
    QString itemText = item->text(0);
    if(Qt::Checked ==item->text(0)){
    
    
        QTreeWidgetItem* parent = item->parent();
        int count = item->childCount();

        //父节点被选中时,子节点全部被选中
        if(count>0){
    
    
            for (int i=0;i<count;i++) {
    
    
                item->child(i)->setCheckState(0,Qt::Checked);
            }
        }
        //选择部分子节点
        else{
    
    
            UpdateParentItem(item);
        }
    }
    else if (Qt::Unchecked == item->checkState(0)){
    
    
        int count = item->childCount();
        if(count>0){
    
    
            for (int i=0;i<count;i++) {
    
    
                item->child(i)->setCheckState(0,Qt::Unchecked);
            }
        }
        else {
    
    
            UpdateParentItem(item);
        }
    }
}




Widget::~Widget()
{
    
    
    delete ui;
}

Demonstration effect:
insert image description here
Problem to be solved: Checking the parent node cannot select all the child nodes, I don't know what is wrong, please give pointers.

Guess you like

Origin blog.csdn.net/wsp_1138886114/article/details/122718136