当前位置:网站首页>QTreeWidget And QTableWidget
QTreeWidget And QTableWidget
2022-06-26 07:11:00 【kchmmd】
Preface
About treeWidget and tableWidget Dynamic addition, deletion, sorting, etc
View


Code
.h file
#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(" Add quantity :");
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); // Set number of columns
m_treeWidget->headerItem()->setHidden(true);// Hide header
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<<" Serial number "<<"str1"<<"str2";
m_tableWidget->setColumnCount(headList.length());
m_tableWidget->setHorizontalHeaderLabels(headList);
m_tableWidget->verticalHeader()->setVisible(false);
m_tableWidget->verticalHeader()->setDefaultSectionSize(20);// Default line height
m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);// Automatically divide the width of each column
//m_tableWidget->horizontalHeader()->setMinimumSectionSize(100);// Default column width
m_tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);// Center the header
m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);// Select by behavior unit
m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);// No editing
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);// Delete child nodes
item->removeChild(childItem);
removeItem(childItem);
delete childItem;// Finally, delete yourself
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;
}
边栏推荐
- 【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码
- One chip realizes functions such as spray 𞓜 ws2812 drive | key touch | LED display | voice broadcast chip and simplifies the design of humidifier products
- PXRD, IR, TGA of two-dimensional porphyrin COF (POR COF) /cof (2D pdpor COF) - supplied by Qiyue
- The performance of iron and steel enterprises was expected to be good in January this year. Since February, the prices of products of iron and steel enterprises have increased significantly. A mighty
- SQL 查询语句
- Iron / zinc / copper / platinum metal complexes such as 5,10,15,20-tetra (4-hydroxyphenyl) porphyrin (THPP) / (thppfe) / (thppzn) / (thppcu) / (thpppt) - Qiyue R & D
- Service interface test guide
- Research Report on market development prospect and investment strategy of China's water soluble film industry 2022-2027
- 【图像分割】基于最大主曲率实现视网膜眼底图像中的血管提取附matlab代码
- Report on China's potassium fluoride Market Survey and suggestions for future development strategic planning 2022
猜你喜欢

快速找到优质对象的5种渠道,赶紧收藏少走弯路

Alkynyl crosslinked porphyrin based polyimide materials (ppbpi-h-cr, ppbpi Mn cr.ppbpi Fe Cr); Metalloporphyrin based polyimide (ppbpi Mn, ppbpi FE) supplied by Qiyue

unity之EasyAR使用

Redis系列——5种常见数据类型day1-3

【图像检测】基于Itti模型实现图像显著性检测附matlab代码

GMP model

面试被问Redis主从复制不会答?这13张图让你彻底弄明白

Calculate division in Oracle - solve the error report when the divisor is zero

How to convert Unicode into Chinese characters in Excel

Excel中Unicode如何转换为汉字
随机推荐
【图像检测】基于Itti模型实现图像显著性检测附matlab代码
【图像融合】基于耦合特征学习的多模式医学图像融合附matlab代码
How to open an account in flush? Is it safe to open an account online?
C implementation adds a progress bar display effect to the specified column of the GridView table in devaxpress - code implementation method
GMP模型
NumPy学习挑战第一关-NumPy的下载与安装
Detailed materials of applying for residence permit in non local Beijing
专业课-代码题记录
Service interface test guide
3D porphyrin MOF (mof-p5) / 3D porphyrin MOF (mof-p4) / 2D cobalt porphyrin MOF (ppf-1-co) / 2D porphyrin COF (POR COF) / supplied by Qiyue
oracle创建带返回值的存储过程并sql执行调用
Promise API for getting started with the web
Cocoscreator plays spine animation
少年,你可知 Kotlin 协程最初的样子?
Database persistence
大厂面试TCP协议经典十五连问!22张图让你彻底弄明白
PyTorch搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
In depth analysis of redis object structure
解决dialog 底部透明的问题
[yolov4] matlab simulation of network target detection based on yolov4 deep learning