当前位置:网站首页>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;
}
边栏推荐
- Liujinhai, chief architect of zhongang Mining: according to the analysis of fluorite supply and demand, it is estimated that the fluorine coating market has great potential
- 5,10,15,20-tetraphenylporphyrin (TPP) and metal complexes fetpp/mntpp/cutpp/zntpp/nitpp/cotpp/pttpp/pdtpp/cdtpp supplied by Qiyue
- 炒股怎么选择证券公司?手机开户安全么?
- Research Report on market development prospect and investment strategy of China's water soluble film industry 2022-2027
- Market development status analysis and investment risk outlook report of China's battery industry 2022-2027
- MySQL operation database
- Pytorch builds CNN LSTM hybrid model to realize multivariable and multi step time series forecasting (load forecasting)
- 缓存使用
- 少年,你可知 Kotlin 协程最初的样子?
- [cellular automata] Based on cellular automata, realize the traffic flow problem of expressway toll station, with matlab code
猜你喜欢

Excel中Unicode如何转换为汉字

Deep exploration image theme color extraction

C#实现给DevExpress中GridView表格指定列添加进度条显示效果——代码实现方式

PyTorch搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
![[image segmentation] blood vessel extraction from retinal fundus images based on maximum principal curvature with matlab code](/img/10/3cef095ae5834bbbe51ef16b5c9f78.png)
[image segmentation] blood vessel extraction from retinal fundus images based on maximum principal curvature with matlab code

ZRaQnHYDAe

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

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

Paths with a certain value in a binary tree (1) (2) (3) (Sword finger offer)

【图像融合】基于耦合特征学习的多模式医学图像融合附matlab代码
随机推荐
Rust中的过程宏
php array_merge详解
$a && $b = $c what???
Six stones Management: exaggerating the achievements, whether the parties themselves know
MySQL storage and custom functions
Dark red crystal meso-5,10,15,20-tetra (p-aminophenyl) cobalt porphyrin (co TAPP); Meso-5,10,15,20-tetra (p-aminophenyl) cobalt porphyrin no complex (TAPP co no) supplied by Qiyue
. Net 20th anniversary! Microsoft sends a document to celebrate
INSERT IGNORE 与INSERT INTO的区别
[image detection] image target size measurement system based on morphology with matlab code
Numpy learning challenge level 5 - create array
php array_ Merge details
How can I find the completely deleted photos in Apple mobile phone?
缓存使用
Easyar use of unity
【图像融合】基于梯度能量、局部能量、 PCA三种融合规则实现MRI-CT图像融合附matlab代码
[image enhancement] image defogging based on artificial multiple exposure fusion amef with matlab code
【图像检测】基于Itti模型实现图像显著性检测附matlab代码
ES cluster_block_exception read_only_allow_delete问题
[feature extraction] feature selection of target recognition information based on sparse PCA with Matlab source code
China's wind farm operation industry's "fourteenth five year plan" planning direction and investment risk prediction report 2022-2027