当前位置:网站首页>QTreeWidget And QTableWidget
QTreeWidget And QTableWidget
2022-06-26 07:00:00 【kchmmd】
前言
关于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;
}
边栏推荐
- LabVIEW Arduino tcp/ip remote smart home system (project part-5)
- 【图像检测】基于形态学实现图像目标尺寸测量系统附matlab代码
- Lightgbm-- parameter adjustment notes
- Guide to "avoid dismissal during probation period"
- LabVIEW arduino TCP / IP Remote Intelligent Home System (Project section - 5)
- Fmt Must the result of println (true) be true?
- Screen sharing recommendations
- [yolov4] matlab simulation of network target detection based on yolov4 deep learning
- Six stones Management: exaggerating the achievements, whether the parties themselves know
- Bugku exercise ---misc--- prosperity, strength and democracy
猜你喜欢

报错问题Parameter index out of range(0 < 1) (1 > number of parameters,which is 0

Easyar use of unity
![[image detection] image target size measurement system based on morphology with matlab code](/img/b4/87c9b1dc3e6fdf6bd58ee7d5a8f37b.png)
[image detection] image target size measurement system based on morphology with matlab code

ZRaQnHYDAe

我在腾讯做测试的这几年...

数据湖架构之Hudi编译篇

淺析一道經典題

MySQL基础用法01

营销技巧:相比较讲产品的优点,更有效的是要向客户展示使用效果
![[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
随机推荐
Here comes the apple ar/vr device exclusive system! Or named realityos
Research Report on pallet handling equipment industry - market status analysis and development prospect forecast
[digital signal processing] basic sequence (unit step sequence | relationship between unit step sequence and unit pulse sequence | rectangular sequence | relationship between rectangular sequence and
Professional course - Code question record
[image fusion] multimodal medical image fusion based on coupled feature learning with matlab code
C nuget offline cache package installation
二叉树中和为某一值的路径(一)(二)(三)(剑指offer)
One chip realizes functions such as spray 𞓜 ws2812 drive | key touch | LED display | voice broadcast chip and simplifies the design of humidifier products
高德地图使用自定义地图无效问题
MySQL
浅析一道经典题
Service interface test guide
淺析一道經典題
SQL query statement
Matlab linear programming model learning notes
海量日志采集工具——Flume
我在腾讯做测试的这几年...
SQL中空值的判断
Analyze 5 indicators of NFT project
Kotlin compose state recovery remembersaveable and remember