Article directory
1. Introduction to UI Controls
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:
Problem to be solved: Checking the parent node cannot select all the child nodes, I don't know what is wrong, please give pointers.