QT开发之TreeWidget、TreeView控件

1、TreeWidget

PS:主要是用于只有一个根节点的需求

①、显示

拖出TreeWidget控件,名称treeWidget

ui->treeWidget->setColumnCount(1); //设置列数
    ui->treeWidget->setHeaderLabel(tr("图像选择")); //设置头的标题

    QTreeWidgetItem *imageItem1 = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("图像1")));
    imageItem1->setIcon(0,QIcon(":/img/1.png"));
    QTreeWidgetItem *imageItem1_1 = new QTreeWidgetItem(imageItem1,QStringList(QString("Band1"))); //子节点1
    imageItem1_1->setIcon(0,QIcon(":/img/1.png"));
    imageItem1->addChild(imageItem1_1); //添加子节点

//以此类推可以添加更多行

ui->treeWidget->expandAll(); //结点全部展开

效果:

 

②获取(单击/双击)的节点序号:

slots:
void showSelectedImage(QTreeWidgetItem*,int);//单击
void showSelectedImage2(QTreeWidgetItem*,int);//双击

//单击
connect(ui->treeWidget,SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(showSelectedImage(QTreeWidgetItem*,int)));

//双击
connect(ui->treeWidget,SIGNAL(itemActivated(QTreeWidgetItem*,int)),this,SLOT(showSelectedImage2(QTreeWidgetItem*,int)));

//单击
void QMySerialPort::showSelectedImage(QTreeWidgetItem *item, int column)//column为列号
{
    //不能判断是那个根节点,只能判断节点的序号
    QTreeWidgetItem *parent = item->parent();
    if(NULL == parent) //注意:最顶端项是没有父节点的,双击这些项时注意(陷阱)
        return;

    int number = parent->indexOfChild(item); //item在父项中的节点行号(从0开始)

    ui->pushButton->setText(QString::number(number));
}

//双击
void QMySerialPort::showSelectedImage2(QTreeWidgetItem *item, int column)//column为列号
{
    //不能判断是那个根节点,只能判断节点的序号
    QTreeWidgetItem *parent = item->parent();
    if(NULL == parent) //注意:最顶端项是没有父节点的,双击这些项时注意(陷阱)
        return;

    int number = parent->indexOfChild(item); //item在父项中的节点行号(从0开始)

    ui->pushButton->setText(QString::number(number));
}

③节点操作

.h

slots:
    void on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);

public:
    QTreeWidgetItem *AddTreeRoot(QString name,QString desc);
    QTreeWidgetItem *AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc);

.cpp

初始化:

ui->treeWidget->setColumnCount(1); //设置列数
    ui->treeWidget->setHeaderLabel(tr("图像选择")); //设置头的标题

    QTreeWidgetItem *imageItem1 = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("图像1")));
    imageItem1->setIcon(0,QIcon(":/img/1.png"));
    QTreeWidgetItem *imageItem1_1 = new QTreeWidgetItem(imageItem1,QStringList(QString("Band1"))); //子节点1
    imageItem1_1->setIcon(0,QIcon(":/img/1.png"));
    imageItem1->addChild(imageItem1_1); //添加子节点

    ui->treeWidget->expandAll(); //结点全部展开


    connect(ui->treeWidget,SIGNAL(currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)),
            this,SLOT(on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)));

    connect(ui->treeWidget,SIGNAL(itemActivated(QTreeWidgetItem*,int)),this,SLOT(showSelectedImage(QTreeWidgetItem*,int)));
    connect(ui->pushButton_2,&QPushButton::clicked,[=]()
    {
        QTreeWidgetItem * item= ui->treeWidget->currentItem();
        if(item!=Q_NULLPTR)
        {
            AddTreeNode(item,"new","new");
        }
        else
        {
            AddTreeRoot("new","new");
        }
    });
    connect(ui->pushButton_3,&QPushButton::clicked,[=]()
    {
        AddTreeRoot("new","new");
    });
    connect(ui->pushButton_4,&QPushButton::clicked,[=]()
    {
        QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();

        if(currentItem==Q_NULLPTR)
        {
            return;
        }
        //如果没有父节点就直接删除
        if(currentItem->parent()==Q_NULLPTR)
        {
            delete ui->treeWidget->takeTopLevelItem(ui->treeWidget->currentIndex().row());
        }
        else
        {
            //如果有父节点就要用父节点的takeChild删除节点
            delete currentItem->parent()->takeChild(ui->treeWidget->currentIndex().row());
        }
    });
    connect(ui->pushButton_5,&QPushButton::clicked,[=]()
    {
        QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();

        if(currentItem==Q_NULLPTR)
        {
            return;
        }
        for(int i=0;i<currentItem->columnCount();i++)
        {
            currentItem->setText(i,tr("Modify")+QString::number(i));
        }
    });

添加功能函数:

QTreeWidgetItem * QMySerialPort::AddTreeRoot(QString name,QString desc)
{
    QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
    ui->treeWidget->addTopLevelItem(item);
    return item;
}

QTreeWidgetItem * QMySerialPort::AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc)
{
    QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
    parent->addChild(item);
    return item;
}

void QMySerialPort::on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
    if(current==Q_NULLPTR)
        return;

    if(previous != Q_NULLPTR)
    {
        previous->setBackground(0,Qt::transparent);
        previous->setTextColor(0,Qt::black);
    }
    current->setTextColor(0,Qt::blue);
    current->setBackground(0,Qt::red);
}

void QMySerialPort::showSelectedImage(QTreeWidgetItem *item, int column)
{
    QTreeWidgetItem *parent = item->parent();
    if(NULL == parent) //注意:最顶端项是没有父节点的,双击这些项时注意(陷阱)
        return;

    int number = parent->indexOfChild(item); //item在父项中的节点行号(从0开始)

    ui->pushButton->setText(QString::number(number));
}

箭头所指为双击节点的序号

 

④、TreeWidget添加快捷菜单

参考:QListWidget添加快捷菜单,https://blog.csdn.net/bigtree_mfc/article/details/102607293

注意问题:

将参数const QPoint &pos换成QPoint point

customContextMenuRequested(QPoint point)

直接添加

connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(on_customContextMenuRequested(QPoint)));

后续都一样

⑤、自定义展开和收缩三角形的图片

ui->treeWidget->setStyleSheet("QTreeView::branch:has-children:!has-siblings:closed,"
            "QTreeView::branch:closed:has-children:has-siblings {"
            "border-image: none;"
            "image: url(:/img/24.png);"//展开的图标
    "}"
                                  "QTreeView::branch:open:has-children:!has-siblings,"
                                 "QTreeView::branch:open:has-children:has-siblings  {"
                                          "border-image: none;"
                                          "image: url(:/img/24.png);"//收缩的图标
                                  "}");

⑥、选中背景颜色修改

connect(ui->treeWidget,&QTreeWidget::currentItemChanged,[=](QTreeWidgetItem *pItem1, QTreeWidgetItem *pItem2)
    {
        QColor m_color_cur = QColor(255,0,0);//选中的颜色修改
        pItem1->setBackgroundColor(0,m_color_cur);

        QColor m_color_pre = QColor(128,128,128);//上次选中背景色修改
        pItem2->setBackgroundColor(0,m_color_pre);
    });

⑦多选和获取状态

ui->treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);//多选
//获取多选选中项内容
QString str;
        QList<QTreeWidgetItem*> TreeleItemList = ui->treeWidget->selectedItems();
        for(int i = 0; i < TreeleItemList.size(); i++)
        {
            str.append(TreeleItemList[i]->text(0) + ",");
        }
        str = str.left(str.size() - 1);
        qDebug() << str;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值