Qt(二)UI控件简介与 可选树状控件演示

一、UI控件简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、可选列表控件演示

新建widget简单应用,打开.ui文件,拖拽TreeWidget。
编辑源码如下:main.cpp文件不动。

//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;
}

演示效果:
在这里插入图片描述
问题待解决:勾选父节点无法选中全部子节点,不知道出了什么问题,请高手指点。

猜你喜欢

转载自blog.csdn.net/wsp_1138886114/article/details/122718136