前言
关于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;
}