QTreeWidget And QTableWidget

前言

关于treeWidget和tableWidget的动态增删排序等

视图

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

代码

.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTreeWidget>
#include <QTableWidget>
#include <QMenu>
#include <QDialog>
#include <QLayout>
#include <QTextEdit>
#include <QLabel>
#include <QPushButton>
#include <QDebug>
#include <QTimer>
class MyDialog: public QDialog
{
    Q_OBJECT
public:
    MyDialog(QWidget *parent = nullptr):QDialog(parent)
    {
       this->setFixedHeight(50);
        QHBoxLayout* hbox =new QHBoxLayout;
        this->setLayout(hbox);
        QLabel* label = new QLabel("添加数量:");
        QTextEdit* edit =new QTextEdit;
        edit->setText(QString::number(10));
        hbox->addWidget(label);
        hbox->addWidget(edit);
        QPushButton* btn = new QPushButton("Ok");
        hbox->addWidget(btn);
        connect(btn,&QPushButton::clicked,this,[=]()mutable
        {
            uint number = edit->toPlainText().toUInt();
            qDebug()<<"QPushButton number:"<<number;
            emit sigNumber(number);
            accept();
        });
    }
signals:
    void sigNumber(uint);
};

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void addItem(QTreeWidgetItem* item, int cnt);
    void addTopItem(QTreeWidget* treeWidget);
    QMenu* getMenu();
    QString getStr();
    void removeItem(QTreeWidgetItem* item);

    void addTableItem();
    void removeTableItem(QTableWidget* item);
    QMenu* getTableMenu();
private:
    QTreeWidget* m_treeWidget;
    QTableWidget* m_tableWidget;
    QTreeWidgetItem* m_currentTreeItem;

    QLabel* m_labelInfoLeft;
    QLabel* m_labelInfoRight;

    QTimer m_timer;
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include <QTime>
#include <QApplication>
#include <QObject>
#include <QHeaderView>
#include <QActionGroup>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    qsrand(time(NULL));
    this->resize(600,500);
    QHBoxLayout* hbox = new QHBoxLayout();
    QVBoxLayout* vboxLeft =new QVBoxLayout();
    QVBoxLayout* vboxRight =new QVBoxLayout();
    QMenu* menu = getMenu();
    m_treeWidget = new QTreeWidget(this);
    m_treeWidget->setColumnCount(1); //设置列数
    m_treeWidget->headerItem()->setHidden(true);//隐藏表头
    m_treeWidget->setMinimumWidth(300);

    connect(m_treeWidget,&QTreeWidget::itemPressed,this,[=](QTreeWidgetItem* item,int column) mutable
    {
        if(qApp->mouseButtons() == Qt::RightButton)
        {
            m_currentTreeItem = item;
            menu->exec(QCursor::pos());
        }

    });
    addTopItem(m_treeWidget);
    m_tableWidget = new QTableWidget(this);
    QList<bool> listFlagAes;
    listFlagAes<<true<<true<<true;
    connect(m_tableWidget->horizontalHeader(),&QHeaderView::sectionClicked,this,[=](int column)mutable{
        if(listFlagAes.at(column))
            m_tableWidget->sortByColumn(column,Qt::AscendingOrder);
        else
            m_tableWidget->sortByColumn(column,Qt::DescendingOrder);
        listFlagAes[column] = !listFlagAes.at(column);
    });
    QStringList headList;
    headList<<"序号"<<"str1"<<"str2";
    m_tableWidget->setColumnCount(headList.length());
    m_tableWidget->setHorizontalHeaderLabels(headList);
    m_tableWidget->verticalHeader()->setVisible(false);
    m_tableWidget->verticalHeader()->setDefaultSectionSize(20);//默认行高
    m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//自动分均每列列宽
    //m_tableWidget->horizontalHeader()->setMinimumSectionSize(100);//默认列宽
    m_tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);//表头居中对齐
    m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//以行为单位选择
    m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止编辑
    m_tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:rgb(216,226,236);"
                                                     "border:0.5px solid rgb(254,254,254);}");
    QMenu* tableMenu = getTableMenu();
    connect(m_tableWidget,&QTableWidget::itemPressed,this,[=](QTableWidgetItem* item){

        if(qApp->mouseButtons() == Qt::RightButton)
        {
            tableMenu->exec(QCursor::pos());
        }
    });
    vboxLeft->addWidget(m_treeWidget);
    m_tableWidget->setMinimumWidth(300);
    addTableItem();
    vboxRight->addWidget(m_tableWidget);
    hbox->addLayout(vboxLeft);
    hbox->addLayout(vboxRight);
    this->setLayout(hbox);
}

Widget::~Widget()
{
}

void Widget::addItem(QTreeWidgetItem *item, int cnt)
{
    QTreeWidgetItem *itemChild =new QTreeWidgetItem();
    item->addChild(itemChild);
    itemChild->setText(0, QString::number(cnt)+getStr());
}

void Widget::addTopItem(QTreeWidget *treeWidget)
{
    static int cnt_1 = 0;
    QTreeWidgetItem *item =new QTreeWidgetItem();
    treeWidget->addTopLevelItem(item);
    item->setText(0, QString("topItem_%1").arg(cnt_1++));
}

QMenu *Widget::getMenu()
{
    QMenu* menu = new QMenu(this);
    connect(menu,&QMenu::triggered,this,[=](QAction* act)
    {
        if( "addTopItem" == act->text())
        {
            MyDialog *dialog = new MyDialog;
            connect(dialog,&MyDialog::sigNumber,this,[=](uint num)mutable{
               for (uint i=0; i<num; i++)
               {
                  addTopItem(m_treeWidget);
               }
               //m_treeWidget->sortItems(0,Qt::AscendingOrder);
            });
            dialog->exec();
            dialog->deleteLater();
        }
        else if( "addItem" == act->text())
        {
            MyDialog *dialog = new MyDialog;
            connect(dialog,&MyDialog::sigNumber,this,[=](uint num)mutable{
                for (uint i=0; i< num; i++)
                {
                    addItem(m_currentTreeItem, i);
                }
                //m_currentTreeItem->sortChildren(0,Qt::AscendingOrder);
            });
            dialog->exec();
            dialog->deleteLater();
        }
        else if( "removeItem" == act->text())
        {
            if(m_currentTreeItem->parent())
            {
                m_currentTreeItem->parent()->removeChild(m_currentTreeItem);
            }
            else
            {
                if(m_treeWidget->topLevelItemCount() == 1)
                    return;
                m_treeWidget->takeTopLevelItem(m_treeWidget->indexOfTopLevelItem(m_currentTreeItem));
            }

        }
        else if( "removeItemAll" == act->text())
        {
            QTreeWidgetItem *item;
            item = m_treeWidget->topLevelItem(0);
            while(item)
            {
                qDebug()<<"item:"<<item;
                 m_treeWidget->takeTopLevelItem(m_treeWidget->indexOfTopLevelItem(item));
                 removeItem(item);
                 delete item;
                 item = nullptr;
                 item = m_treeWidget->topLevelItem(0);
                 qDebug()<<"item_over:"<<item;
            }

            addTopItem(m_treeWidget);
        }
        else if( "testCase" == act->text())
        {
            MyDialog *dialog = new MyDialog;
            connect(dialog,&MyDialog::sigNumber,this,[=](uint num)mutable{
                for (uint j=0; j<num; j++) {

                    for (uint i=0; i< 1000; i++)
                    {
                        addTopItem(m_treeWidget);
                        qDebug()<<"creating :"<<j<<"/"<<num<<" "<<i<<"/"<<"10000";
                    }
                    qDebug()<<"create sucess!";

                    QTreeWidgetItem *item;
                    item = m_treeWidget->topLevelItem(0);
                    int cnt =0;
                    while(item)
                    {
                        qDebug()<<"deleting :"<<j<<"/"<<num<<" "<<cnt<<"/"<<"10000";
                         m_treeWidget->takeTopLevelItem(m_treeWidget->indexOfTopLevelItem(item));
                         removeItem(item);
                         delete item;
                         item = nullptr;
                         item = m_treeWidget->topLevelItem(0);
                         cnt++;
                    }

                    addTopItem(m_treeWidget);
                    qDebug()<<"delete sucess!";
                }
                //m_currentTreeItem->sortChildren(0,Qt::AscendingOrder);
            });
            dialog->exec();
            dialog->deleteLater();
        }
        else if( "Ascending" == act->text() )
        {
            m_currentTreeItem->sortChildren(0,Qt::AscendingOrder);
        }
        else if( "Descending" == act->text() )
        {
            m_currentTreeItem->sortChildren(0,Qt::DescendingOrder);
        }
    });
    menu->addAction("addTopItem");
    menu->addAction("addItem");
    menu->addAction("removeItem");
    menu->addAction("removeItemAll");
    menu->addAction("testCase");
    QActionGroup* group =new QActionGroup(menu);
    QAction* act_1 = new QAction(group);
    act_1->setText("Ascending");
    act_1->setCheckable(true);
    QAction* act_2 = new QAction(group);
    act_2->setText("Descending");
    act_2->setCheckable(true);
    menu->addAction(act_1);
    menu->addAction(act_2);
    return menu;
}

QString Widget::getStr()
{

   int length = rand()%15+5;
   const char ch[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
   int size = sizeof(ch);

   char* str = new char[length + 1];

   int num = 0;
   int i;
   for (i = 0; i < length; ++i)
   {
       num = rand() % (size - 1);
       str[i] = ch[num];
   }
    str[i] = '\0';
   QString res(str);
   return res;
}

void Widget::removeItem(QTreeWidgetItem *item)
{
    int count = item->childCount();
    for(int i=0; i<count; i++)
    {
        QTreeWidgetItem *childItem = item->child(0);//删除子节点
        item->removeChild(childItem);
        removeItem(childItem);
        delete childItem;//最后将自己删除
        childItem = nullptr;
    }
}

void Widget::addTableItem()
{
    static int cnt=0;
    int row = m_tableWidget->rowCount() + 1;
    m_tableWidget->setRowCount(row);
    QTableWidgetItem* item =new QTableWidgetItem();
    m_tableWidget->setItem(row-1, 0, item);
    m_tableWidget->item(row-1,0)->setText(QString::number(cnt++));


    QTableWidgetItem* item_1 =new QTableWidgetItem();
    m_tableWidget->setItem(row - 1, 1, item_1);
    m_tableWidget->item(row - 1, 1)->setText(getStr());


    QTableWidgetItem* item_2 =new QTableWidgetItem();
    m_tableWidget->setItem(row - 1, 2, item_2);
    m_tableWidget->item(row - 1,2)->setText(getStr());
}

QMenu *Widget::getTableMenu()
{
    QMenu* menu = new QMenu(this);
    connect(menu,&QMenu::triggered,this,[=](QAction* act){
       if( "addItem" == act->text())
       {
           MyDialog *dialog = new MyDialog;
           connect(dialog,&MyDialog::sigNumber,this,[=](uint num)mutable{
              for (uint i=0; i<num; i++)
              {
                  addTableItem();
              }
           });
           dialog->exec();
           dialog->deleteLater();

       }
       else if( "removeItem" == act->text() )
       {
           m_tableWidget->clearContents();
           m_tableWidget->setRowCount(0);
           addTableItem();
       }
    });
    menu->addAction("addItem");
    menu->addAction("removeItem");
    return menu;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值