widget.h 代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTreeWidget>
#include <QMenu>
#include <QContextMenuEvent>
#include "QDebug"
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
// 父类 BaseWidget
class BaseWidget {
public:
BaseWidget(int baseValue) : m_baseValue(baseValue) {
qDebug()<< "父类构造: " << m_baseValue ;
}
protected:
int m_baseValue;
};
// 子类 CustomWidget 继承自 BaseWidget
class CustomWidget : public BaseWidget {
public:
//构造函数初始化父类 构造 默认父类构造是0
CustomWidget(int value, QString name = "", int baseValue = 0) : BaseWidget(baseValue), m_value(value), m_name(name) {}
void displayInfo() {
qDebug()<<"子类Value: " << m_value << ", Name: " << m_name << ", BaseValue: " << m_baseValue;
}
private:
int m_value;
QString m_name;
};
class Widget;
class AA: public QTreeWidget{
public:
//实参是: static_cast<QWidget*>(this) 形参是: QWidget* parent(作用用来初始化父类指针)
AA(QWidget* parent = nullptr,Widget *a_w = nullptr)
: QTreeWidget(parent),w(a_w) {}
int a = 10;
protected:
void contextMenuEvent(QContextMenuEvent *event) override;
private:
Widget *w;
};
class Widget : public AA
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void insert_data();
//删除
void update_data1();
QList<QTreeWidgetItem*> list_Item_parent;
QList<QTreeWidgetItem*> list_Item_child;
QTreeWidgetItem* parent1;
QTreeWidgetItem* child1_1;
QTreeWidgetItem* child1_2;
QTreeWidgetItem* parent2;
QTreeWidgetItem* child2_1;
QTreeWidgetItem* child2_2;
QTreeWidgetItem *child2_3;
private:
Ui::Widget *ui;
AA* treeWidget;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QSet>
#include <QStringList>
Widget::Widget(QWidget *parent)
{
QStringList li = {"aa","bb","cc","dd"};
QStringList la = {"aa","bb"};
QSet<QString> set_li = QSet<QString>::fromList(li);
QSet<QString> set_la = QSet<QString>::fromList(la);
QSet<QString> result = set_li - set_la;
qDebug()<<"result: "<<result;
CustomWidget widget1(10, "Widget1",100);
widget1.displayInfo();
CustomWidget widget2(20,"qqqqqq");
widget2.displayInfo();
if(li.size() > la.size())
{
QSet<QString> result = set_li - set_la;
}
else{
QSet<QString> result = set_li - set_la;
}
ui->setupUi(this);
//qDebug()<<"a:"<<a; //继承了A类的元素 所以可以直接使用aa这个属性
//下面的构造第一个参数是强制类型转换 把当前对象指针this强转成QWidget类型、给QWidget* parent、(子类构造初始化父类构造传参)(可以转是因为Widget 继承AA类、AA类继承了QTreeWidget,QTreeWidget又继承了QWidget所以可以强行转换)
//下面的构造第二个参数是当前指针的对象、 通过构造函数列表初始化传递给了AA类成员Widget *w了。
treeWidget = new AA(static_cast<QWidget*>(this),this); // 这里进行了修改
treeWidget->resize(500,500);
// 假设 treeWidget 是你的 QTreeWidget 对象
// 创建父节点1
parent1 = new QTreeWidgetItem(treeWidget);
parent1->setText(0, "Parent 1");
// 创建子节点1-1
child1_1 = new QTreeWidgetItem(parent1);
child1_1->setText(0, "Child 1-1");
// 创建子节点1-2
child1_2 = new QTreeWidgetItem(parent1);
child1_2->setText(0, "Child 1-2");
list_Item_parent.append(parent1);
list_Item_child.append(child1_1);
list_Item_child.append(child1_2);
// 将子节点添加到父节点1
// parent1->addChild(child1_1);
// parent1->addChild(child1_2);
// 添加到根节点
// treeWidget->addTopLevelItem(parent1);
// 创建父节点2
parent2 = new QTreeWidgetItem(treeWidget);
parent2->setText(0, "Parent 2");
// 创建子节点2-1
child2_1 = new QTreeWidgetItem(parent2);
child2_1->setText(0, "Child 2-1");
// 创建子节点2-2
child2_2 = new QTreeWidgetItem(parent2);
child2_2->setText(0, "Child 2-2");
}
Widget::~Widget()
{
delete ui;
}
void Widget::insert_data()
{
// 创建子节点2-2
child2_3 = new QTreeWidgetItem(parent2);
child2_3->setText(0, "Child 2-3");
}
//删除父节点和父节点下的子节点
// void Widget::update_data1()
// {
// //** 通过子节点 删除父节点 假设 child1_1 是要删除的子节点
// QTreeWidgetItem* parentItem = child1_1->parent();
// // 假设 parentItem 是父节点
// QList<QTreeWidgetItem*> childItems = parentItem->takeChildren(); // 获取所有子节点
// // 释放子节点的内存
// for (QTreeWidgetItem* child : childItems)
// {
// delete child;
// }
// // 释放父节点的内存(如果需要)
// delete parentItem;
// }
//删除一个子节点
void Widget::update_data1()
{
// 释放父节点的内存(如果需要)
delete child1_2;
}
#include "QVBoxLayout"
#include "QLabel"
void AA::contextMenuEvent(QContextMenuEvent *event) {
QMenu menu(this);
QAction* action0 = menu.addAction("新增");
QAction* action1 = menu.addAction("删除");
QAction* action2 = menu.addAction("图表");
// TreefileDock t;
// Advanced_Docking advance_docking;
// TreefileDock tree_dock;
QAction* selectedItem = menu.exec(event->globalPos());
if (selectedItem == action1) {
// 执行 Action 1 的操作
// t.createWidgets();
w->update_data1();
}else if(selectedItem == action0)
{
w->insert_data();
}
else if (selectedItem == action2) {
// 获取所有项目
QList<QTreeWidgetItem*> allItems;
QTreeWidgetItemIterator it(this);
while (*it) {
allItems.append(*it);
++it;
}
int num = 0;
// 遍历所有项目,检查是否被勾选
for (QTreeWidgetItem* item : allItems) {
if (item->checkState(0) == Qt::Checked) {
// 获取并打印项目的名称
QString name = item->text(0);
qDebug() << "Checked item: " << name;
// 创建一个新的 QWidget 实例
QWidget* window = new QWidget();
// 设置 Qt::WA_DeleteOnClose 属性为 true
window->setAttribute(Qt::WA_DeleteOnClose);
// 创建一个新的 QVBoxLayout 实例
QVBoxLayout* layout = new QVBoxLayout();
// 创建一个新的 QLabel 实例,并设置其文本为项目的名称
QLabel* label = new QLabel(name);
// 创建一个新的 QCustomPlot 实例
QLabel* plot = new QLabel("哇咔咔");
// 将 QLabel 和 QCustomPlot 实例添加到布局中
layout->addWidget(label);
layout->addWidget(plot);
// 将布局设置为 QWidget 的布局
window->setLayout(layout);
window->move(num,num);
num+=20;
// 显示 QWidget
window->show();
}
}
}
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}