当前位置:网站首页>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;
}
边栏推荐
- SQL query statement
- Load balancer does not have available server for client: userservice problem solving
- MySQL operation database
- 【图像分割】基于最大主曲率实现视网膜眼底图像中的血管提取附matlab代码
- Shell input validation alphanumeric only
- [image fusion] MRI-CT image fusion based on gradient energy, local energy and PCA fusion rules with matlab code
- Marketing skills: compared with the advantages of the product, it is more effective to show the use effect to customers
- Development trends and prospects of acrylamide crystallization market in the world and China 2022-2027
- Market survey of China's coal to liquid industry and analysis report on investment competitiveness during the "14th five year plan" 2022-2027
- ~94 zoom
猜你喜欢
随机推荐
MySQL operation database
【图像增强】基于人工多重曝光融合AMEF实现图像去雾附matlab代码
在公司逮到一个阿里10年的测试开发,聊过之后大彻大悟...
Phantom star VR equipment product details II: dark battlefield
Development trends and prospects of acrylamide crystallization market in the world and China 2022-2027
NumPy学习挑战第四关-NumPy数组属性
STM 32 uses cube to generate Tim to trigger ADC and transmit through DMA
Turris omnia: an open source router technology favored by hackers
Cocoscreator plays spine animation
How to set MySQL triggers is a simple tutorial for novices
Bugku练习题---MISC---富强民主
JS download pictures
Research Report on market supply and demand and strategy of China's pallet scale industry
SQL中空值的判断
我在腾讯做测试的这几年...
【图像分割】基于最大主曲率实现视网膜眼底图像中的血管提取附matlab代码
网络io,磁盘io
SHOW语句用法补充
China peek market outlook and future strategic planning proposal report 2022-2027
专业课-代码题记录








