国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

主題設(shè)計(jì)師站專業(yè)網(wǎng)站制作

主題設(shè)計(jì)師站,專業(yè)網(wǎng)站制作,在建設(shè)廳網(wǎng)站怎么辦建造師延期,工作證的照片幾寸介紹 此文章記錄QTreeWidget的重寫進(jìn)度,暫時(shí)停滯使用,重寫了QTreeWidget的拖拽功能,和繪制功能,自定義了數(shù)據(jù)結(jié)構(gòu),增加復(fù)制,粘貼,刪除,準(zhǔn)備實(shí)現(xiàn)動態(tài)刷新數(shù)據(jù)支持千萬數(shù)據(jù)動態(tài)刷新&a…

介紹

此文章記錄QTreeWidget的重寫進(jìn)度,暫時(shí)停滯使用,重寫了QTreeWidget的拖拽功能,和繪制功能,自定義了數(shù)據(jù)結(jié)構(gòu),增加復(fù)制,粘貼,刪除,準(zhǔn)備實(shí)現(xiàn)動態(tài)刷新數(shù)據(jù)支持千萬數(shù)據(jù)動態(tài)刷新,重寫了部分代碼,重寫了滑塊拖拽但是有bug。

效果展示

在這里插入圖片描述
在這里插入圖片描述

實(shí)現(xiàn)功能

  1. 實(shí)現(xiàn)了自定義節(jié)點(diǎn)類來存儲數(shù)據(jù)。
  2. item采用Label來實(shí)現(xiàn)富文本顯示(數(shù)據(jù)量大不建議使用)。
  3. 重寫了QTreeWidget拖拽,滾動,繪制。
  4. 拖拽實(shí)現(xiàn)了節(jié)點(diǎn)與節(jié)點(diǎn)之間的互相拖拽,僅移動。
  5. 實(shí)現(xiàn)了節(jié)點(diǎn)的遞歸遍歷,查找,插入,刪除。
  6. 實(shí)現(xiàn)了滾動刷新數(shù)據(jù),大量數(shù)據(jù)也不卡,但是滾動條刷新數(shù)據(jù)稍微復(fù)雜未完成,且有bug。

代碼

#ifndef MYTREEWIDGET_H
#define MYTREEWIDGET_H#include <QWidget>
#include <QtWidgets>
#include <QDebug>class MyTreeWidgetItem;
class TreeNode;
class MyLabel;// 自定義節(jié)點(diǎn)類
class TreeNode {
public:QString nodeText;QString nodeItemTest;QList<TreeNode*> children;TreeNode* parent = nullptr;MyTreeWidgetItem* item;// 重載==運(yùn)算符以判斷nodeText是否相等bool operator==(const TreeNode& other) const {return nodeText == other.nodeText;}
};class MyTreeWidgetItem :public QTreeWidgetItem
{
public:MyTreeWidgetItem();void setNodeText(QString str);QString getNodeText();QString m_Text;MyLabel* m_Label;int indexOfChild(QTreeWidgetItem *child){int childCount = this->childCount();for (int i = 0; i < childCount; ++i) {if (this->child(i) == child) {return i;}}return -1;}
};class MyLabel : public QLabel
{Q_OBJECT
public:MyLabel(QString text, QWidget *parent = nullptr);bool m_IsSelect = false;bool m_IsLeave = true;QString enterStyle;QString leaveStyle;QString selectStyle;
protected:bool eventFilter(QObject *watched, QEvent *event);
};class MyTreeWidget : public QTreeWidget
{Q_OBJECT
public:MyTreeWidget(QWidget *parent = nullptr);QList<TreeNode*> m_ListData;void wait(int ms); //等待// 刪除具有特定文本的節(jié)點(diǎn)及其子節(jié)點(diǎn)bool deleteNodeByText(const QString& targetText) {for (int i = 0; i < m_ListData.size(); ++i) {TreeNode* node = m_ListData.at(i);if (node->nodeText == targetText) {// 找到目標(biāo)節(jié)點(diǎn),刪除其子節(jié)點(diǎn)qDeleteAll(node->children);delete node;m_ListData.removeAt(i);return true; // 成功刪除節(jié)點(diǎn)}}return false; // 未找到匹配的節(jié)點(diǎn)}//刪除指定父節(jié)點(diǎn)下的子節(jié)點(diǎn)bool deleteChildNode(TreeNode* node, const QString& nodeText) {for (int i = 0; i < node->children.size(); ++i) {if (node->children.at(i)->nodeText == nodeText) {node->children.removeAt(i);return true;}}return false;}//根據(jù)nodeText遞歸查找該對象TreeNode* recursiveFindNodeByText(const QString& targetText, TreeNode* currentNode) {if (currentNode->nodeText == targetText) {return currentNode;}for (TreeNode* child : currentNode->children) {TreeNode* result = recursiveFindNodeByText(targetText, child);if (result) {return result;}}return nullptr; // 未找到匹配的節(jié)點(diǎn)}//根據(jù)nodeText遞歸查找該對象TreeNode* findNodeByText(const QString& targetText, const QList<TreeNode*>& nodeList) {for (TreeNode* node : nodeList) {TreeNode* result = recursiveFindNodeByText(targetText, node);if (result) {return result;}}return nullptr; // 未找到匹配的節(jié)點(diǎn)}//插入字節(jié)點(diǎn) 包括數(shù)據(jù)更新TreeNode* insertChileItem(TreeNode* parentNode, int row, QString itemText);//追加子節(jié)點(diǎn)TreeNode* appendChileItem(TreeNode* parentNode, QString itemText);//插入頂部節(jié)點(diǎn)TreeNode* insertTopItem(int row, QString itemText, bool isInster = true);//void updateItem(int row, TreeNode* node);//追加頂部節(jié)點(diǎn)TreeNode* appendTopItem(QString itemText);//刪除頂部的item 以及數(shù)據(jù)列表void removeTopItem(TreeNode* node);//一個(gè)更新nodetext的變量保證每次更新節(jié)點(diǎn)都會變化int number = 0;double m_NodeSize = 0;double m_ScrollBarValue = 0;bool m_BarValueChangedTemp = false;bool m_WheelEventTemp = false;//遞歸插入void RecursionInsert(TreeNode* ParentNode, TreeNode* childNode);//展開所有子節(jié)點(diǎn)void expandAllItems(QTreeWidget* treeWidget, QTreeWidgetItem* item);void onScrollBarValueChanged(int value);
protected:void mouseMoveEvent(QMouseEvent *event);void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void startDrag(Qt::DropActions supportedActions);void dragEnterEvent(QDragEnterEvent *event);void dragMoveEvent(QDragMoveEvent *event);void dropEvent(QDropEvent *event);void paintEvent(QPaintEvent* event);void wheelEvent(QWheelEvent *event);
private:TreeNode* m_CopyNode = nullptr; //當(dāng)前拷貝的節(jié)點(diǎn)QPoint m_DragMovePos; //拖拽移動坐標(biāo)QPoint m_CurPos; //點(diǎn)擊保存坐標(biāo)int m_LastScrollBarValue = 0;QMenu* m;MyTreeWidgetItem* m_CurrDragItem = nullptr; //保存當(dāng)前正在拖拽的對象QScrollBar *m_VerticalScrollBar;
};#endif // MYTREEWIDGET_H
/******************************************************************************** Copyright [2023] <鍵鼠自動化>* All rights reserved.** version:     1.0* author:      lx* brief:       自定義item,重寫繪制和拖拽,以及建立數(shù)據(jù)結(jié)構(gòu)
*******************************************************************************/
#include "mytreewidget.h"MyTreeWidget::MyTreeWidget(QWidget *parent): QTreeWidget(parent)
{setDragEnabled(true);setAcceptDrops(true);setDragDropMode(DragDropMode::InternalMove);setHeaderHidden(true);m_VerticalScrollBar = this->verticalScrollBar();connect(m_VerticalScrollBar, &QScrollBar::valueChanged, this, &MyTreeWidget::onScrollBarValueChanged);m = new QMenu(this);QAction* action1 = new QAction("刪除");QAction* action2 = new QAction("復(fù)制");QAction* action3 = new QAction("粘貼");connect(action1, &QAction::triggered, [=]() {MyTreeWidgetItem* targetItem = dynamic_cast<MyTreeWidgetItem*>(itemAt(m_CurPos));if (targetItem) {TreeNode* targetNode = findNodeByText(targetItem->getNodeText(), m_ListData);if (targetNode->parent == nullptr) {this->removeTopItem(targetNode);}else {targetNode->parent->item->removeChild(targetNode->item);deleteChildNode(targetNode->parent, targetNode->nodeText);}}qDebug() << "1231231";});connect(action2, &QAction::triggered, [=](){MyTreeWidgetItem* targetItem = dynamic_cast<MyTreeWidgetItem*>(itemAt(m_CurPos));if (targetItem) {m_CopyNode = findNodeByText(targetItem->getNodeText(), m_ListData);}});connect(action3, &QAction::triggered, [=]() {MyTreeWidgetItem* targetItem = dynamic_cast<MyTreeWidgetItem*>(itemAt(m_CurPos));if (targetItem && m_CopyNode != nullptr) {TreeNode* targetNode = findNodeByText(targetItem->getNodeText(), m_ListData);if (targetNode->parent == nullptr) {int targetRow = this->indexOfTopLevelItem(targetNode->item);if (m_CopyNode->children.isEmpty()) {this->insertTopItem(targetRow + 1, m_CopyNode->nodeItemTest);}else {TreeNode* newParentNode = this->insertTopItem(targetRow + 1, m_CopyNode->nodeItemTest);for (int i = 0 ; i < m_CopyNode->children.size(); ++i) {this->RecursionInsert(newParentNode, m_CopyNode->children.at(i));}}}else {int targetRow = targetNode->parent->item->indexOfChild(targetNode->item);if (m_CopyNode->children.isEmpty()) {this->insertChileItem(targetNode->parent, targetRow + 1, m_CopyNode->nodeItemTest);}else {TreeNode* newParentNode = this->insertChileItem(targetNode->parent, targetRow + 1, m_CopyNode->nodeItemTest);for (int i = 0 ; i < m_CopyNode->children.size(); ++i) {this->RecursionInsert(newParentNode, m_CopyNode->children.at(i));}}}m_CopyNode = nullptr;}});m->addAction(action1);m->addAction(action2);m->addAction(action3);
}void MyTreeWidget::wait(int ms)
{QElapsedTimer t;t.start();while (t.elapsed() < ms)QCoreApplication::processEvents();
}TreeNode *MyTreeWidget::insertChileItem(TreeNode *parentNode, int row, QString itemText)
{number++;QTreeWidgetItem* parentItem = parentNode->item; //獲取父節(jié)點(diǎn)MyTreeWidgetItem* childItem = new MyTreeWidgetItem(); //創(chuàng)建子節(jié)點(diǎn)childItem->setNodeText(QString("child%1").arg(number));MyLabel* label = new MyLabel(itemText); //創(chuàng)建labelchildItem->m_Label = label;TreeNode* childData = new TreeNode; //創(chuàng)建子節(jié)點(diǎn)對象數(shù)據(jù)childData->parent = parentNode;childData->item = childItem;childData->nodeText = QString("child%1").arg(number);childData->nodeItemTest = itemText;parentNode->children.insert(row, childData); //父節(jié)點(diǎn)對象數(shù)據(jù)插入子節(jié)點(diǎn)parentItem->insertChild(row, childItem); //父節(jié)點(diǎn)item插入子節(jié)點(diǎn)itemsetItemWidget(childItem, 0, label); //item轉(zhuǎn)換lablereturn childData;
}TreeNode *MyTreeWidget::appendChileItem(TreeNode *parentNode, QString itemText)
{number++;QTreeWidgetItem* parentItem = parentNode->item;MyTreeWidgetItem* childItem = new MyTreeWidgetItem();childItem->setNodeText(QString("child%1").arg(number));MyLabel* label = new MyLabel(itemText);childItem->m_Label = label;TreeNode* childData = new TreeNode;childData->parent = parentNode;childData->item = childItem;childData->nodeText = QString("child%1").arg(number);childData->nodeItemTest = itemText;parentNode->children.append(childData);parentItem->addChild(childItem);setItemWidget(childItem, 0, label);return childData;
}TreeNode* MyTreeWidget::insertTopItem(int row, QString itemText, bool isInster)
{number++;MyTreeWidgetItem* parentItem = new MyTreeWidgetItem();parentItem->setNodeText(QString("parent%1").arg(number));TreeNode* parentData = new TreeNode;parentData->item = parentItem;parentData->nodeText = QString("parent%1").arg(number);parentData->nodeItemTest = itemText;if (isInster) {MyLabel* label = new MyLabel(itemText);parentItem->m_Label = label;insertTopLevelItem(row, parentItem);setItemWidget(parentItem, 0, label);}m_ListData.insert(row, parentData);return parentData;
}void MyTreeWidget::updateItem(int row, TreeNode *node)
{qDebug() << row << node->nodeItemTest << "aaaa";MyLabel* label = new MyLabel(node->nodeItemTest);node->item->m_Label = label;insertTopLevelItem(row, node->item);
//    setItemWidget(node->item, 0, label);
}TreeNode *MyTreeWidget::appendTopItem(QString itemText)
{number++;MyTreeWidgetItem* parentItem = new MyTreeWidgetItem();parentItem->setNodeText(QString("parent%1").arg(number));MyLabel* label = new MyLabel(itemText);parentItem->m_Label = label;TreeNode* parentData = new TreeNode;parentData->item = parentItem;parentData->nodeText = QString("parent%1").arg(number);parentData->nodeItemTest = itemText;addTopLevelItem(parentItem);setItemWidget(parentItem, 0, label);m_ListData.append(parentData);return parentData;
}void MyTreeWidget::removeTopItem(TreeNode *node)
{int index = indexOfTopLevelItem(node->item);takeTopLevelItem(index);deleteNodeByText(node->nodeText);
}void MyTreeWidget::RecursionInsert(TreeNode *ParentNode, TreeNode *childNode)
{TreeNode* node = this->appendChileItem(ParentNode, childNode->nodeItemTest);for (int i = 0 ; i < childNode->children.size(); ++i) {this->RecursionInsert(node, childNode->children.at(i));}
}void MyTreeWidget::expandAllItems(QTreeWidget *treeWidget, QTreeWidgetItem *item)
{if (item) {treeWidget->expandItem(item); // 展開當(dāng)前項(xiàng)// 遞歸展開子項(xiàng)for (int i = 0; i < item->childCount(); ++i) {expandAllItems(treeWidget, item->child(i));}}
}void MyTreeWidget::onScrollBarValueChanged(int value)
{//m_BarValueChangedTemp用于該函數(shù)在沒有結(jié)束的時(shí)候又進(jìn)來了如果不調(diào)用takeTopLevelItem就沒事,如果沒有m_BarValueChangedTemp在該函數(shù)未結(jié)束還會進(jìn)入導(dǎo)致崩潰int step = 3; //滾動一次刷新三條數(shù)據(jù)if (value >= m_VerticalScrollBar->maximum()) {for (int index = 0; index < 1; ++index) {int itemCount = this->topLevelItemCount();MyTreeWidgetItem* bottomItem = dynamic_cast<MyTreeWidgetItem*>(this->topLevelItem(itemCount - 1));TreeNode* bottomNode = findNodeByText(bottomItem->getNodeText(), m_ListData);int bottomIndex = m_ListData.indexOf(bottomNode);if (bottomIndex + 100 < m_ListData.size()) {step = 1000;}else {step = (m_ListData.size() - 1) - bottomIndex;}for (int i = 0 ; i < step; ++i) {//尾部追加顯示//獲取當(dāng)前底部的數(shù)據(jù)bottomIndex++;updateItem(itemCount, m_ListData.at(bottomIndex));itemCount++;}for (int i = 0 ; i < step; ++i) {takeTopLevelItem(0);}}qDebug() << QDateTime::currentDateTime() << "222222222222222222";m_VerticalScrollBar->setValue(value-5);}/*  if (m_BarValueChangedTemp) {qDebug() << "onScrollBarValueChanged未結(jié)束就進(jìn)入";return;}if (m_WheelEventTemp) {qDebug() << "wheelEvent正在滾動中";return;}m_BarValueChangedTemp = true;qDebug() << value << m_LastScrollBarValue<<  this->topLevelItemCount();int step = 3; //滾動一次刷新三條數(shù)據(jù)if (m_LastScrollBarValue > value) {// 上拉int number = m_LastScrollBarValue - value;for (int index = 0; index < number; ++index) {MyTreeWidgetItem* topItem = dynamic_cast<MyTreeWidgetItem*>(this->topLevelItem(0));TreeNode* topNode = findNodeByText(topItem->getNodeText(), m_ListData);int topIndex = m_ListData.indexOf(topNode);if (topIndex - 3 > 0) {step = 3;}else {step = topIndex;}for (int i = step; i > 0; --i) {//尾部追加顯示//獲取當(dāng)前底部的數(shù)據(jù)topIndex--;updateItem(0, m_ListData.at(topIndex));}for (int i = 0 ; i < step; ++i) {takeTopLevelItem(this->topLevelItemCount() - 1);}}}else {int number = value - m_LastScrollBarValue;qDebug() << QDateTime::currentDateTime() << "111111111111111";for (int index = 0; index < number; ++index) {int itemCount = this->topLevelItemCount();MyTreeWidgetItem* bottomItem = dynamic_cast<MyTreeWidgetItem*>(this->topLevelItem(itemCount - 1));TreeNode* bottomNode = findNodeByText(bottomItem->getNodeText(), m_ListData);int bottomIndex = m_ListData.indexOf(bottomNode);if (bottomIndex + 3 < m_ListData.size()) {step = 3;}else {step = (m_ListData.size() - 1) - bottomIndex;}for (int i = 0 ; i < step; ++i) {//尾部追加顯示//獲取當(dāng)前底部的數(shù)據(jù)bottomIndex++;updateItem(itemCount, m_ListData.at(bottomIndex));itemCount++;}for (int i = 0 ; i < step; ++i) {takeTopLevelItem(0);}}qDebug() << QDateTime::currentDateTime() << "222222222222222222";}m_ScrollBarValue = value;m_LastScrollBarValue = value;m_VerticalScrollBar->setValue(value);m_BarValueChangedTemp = false;*/
}void MyTreeWidget::mouseMoveEvent(QMouseEvent *event)
{QTreeWidget::mouseMoveEvent(event);
}void MyTreeWidget::mousePressEvent(QMouseEvent *event)
{QTreeWidget::mousePressEvent(event);m_CurPos = event->pos();if (event->buttons() & Qt::RightButton) {m->move((QCursor::pos()));m->show();}}void MyTreeWidget::mouseReleaseEvent(QMouseEvent *event)
{QTreeWidget::mouseReleaseEvent(event);
}void MyTreeWidget::startDrag(Qt::DropActions supportedActions)
{//拖拽重寫此函數(shù)下發(fā)當(dāng)前拖拽對象的nodetextQ_UNUSED(supportedActions);MyTreeWidgetItem* currItem = dynamic_cast<MyTreeWidgetItem*>(this->currentItem());if (currItem) {QString text = currItem->getNodeText();QMimeData* mimeData = new QMimeData;mimeData->setData("application/labelData", text.toUtf8());QDrag* drag = new QDrag(this);drag->setMimeData(mimeData);m_CurrDragItem = currItem;drag->start(Qt::MoveAction);}
}void MyTreeWidget::dragEnterEvent(QDragEnterEvent *event)
{QTreeWidget::dragEnterEvent(event);// 檢查拖拽數(shù)據(jù)格式if (event->mimeData()->hasFormat("application/labelData")) {event->acceptProposedAction();}
}void MyTreeWidget::dragMoveEvent(QDragMoveEvent *event)
{QTreeWidget::dragMoveEvent(event);// 檢查拖拽數(shù)據(jù)格式if (event->mimeData()->hasFormat("application/labelData")) {event->acceptProposedAction();m_DragMovePos = event->pos();viewport()->update();}}void debugTreeData(TreeNode* node, int depth = 0) {QString kongge;for (int i = 0; i < depth; ++i) {kongge.append("----");}qDebug() << kongge << node->nodeItemTest << node->nodeText;for (int i = 0; i < node->children.size(); ++i) {debugTreeData(node->children.at(i), depth + 1); // 遞歸時(shí)深度加1}
}void MyTreeWidget::dropEvent(QDropEvent *event)
{// 檢查拖拽數(shù)據(jù)格式if (event->mimeData()->hasFormat("application/labelData")) {QString itemData = event->mimeData()->data("application/labelData");MyTreeWidgetItem* targetItem = dynamic_cast<MyTreeWidgetItem*>(itemAt(event->pos()));m_CurrDragItem = nullptr;if (!targetItem) {return;}qDebug() << itemData << "-------------------" << targetItem->getNodeText();TreeNode* targetNode = findNodeByText(targetItem->getNodeText(), m_ListData);TreeNode* sourceNode = findNodeByText(itemData, m_ListData);if (sourceNode && targetNode) {// 找到了匹配的節(jié)點(diǎn),可以對其進(jìn)行操作qDebug() << "找到了匹配的節(jié)點(diǎn),可以對其進(jìn)行操作" << targetNode->nodeText << sourceNode->nodeText;if (sourceNode->parent == nullptr && targetNode->parent == nullptr) { //父與父//當(dāng)前是父節(jié)點(diǎn)與父節(jié)點(diǎn)直接拖拽int targetRow = this->indexOfTopLevelItem(targetNode->item);int sourceRow = this->indexOfTopLevelItem(sourceNode->item);if (targetRow != sourceRow) {qDebug() << "1111111111111111" << targetRow << sourceRow;//在目標(biāo)源下插入一行if (sourceNode->children.isEmpty()) {this->insertTopItem(targetRow + 1, sourceNode->nodeItemTest);//刪除來源itemthis->removeTopItem(sourceNode);}else if (!sourceNode->children.isEmpty()) {//如果來源里面有子節(jié)點(diǎn)就需要遞歸插入,先查入頭節(jié)點(diǎn)TreeNode* newParentNode = this->insertTopItem(targetRow + 1, sourceNode->nodeItemTest);for (int i = 0 ; i < sourceNode->children.size(); ++i) {this->RecursionInsert(newParentNode, sourceNode->children.at(i));}//刪除來源itemthis->removeTopItem(sourceNode);deleteNodeByText(sourceNode->nodeText);}else {qDebug() << "未知?jiǎng)幼?!!!!!!!!!!!!!!!!!!!!!!!";}}}else if (sourceNode->parent != nullptr && targetNode->parent != nullptr) { //子與子//雙方都是子節(jié)點(diǎn)int targetRow = targetNode->parent->item->indexOfChild(targetNode->item);int sourceRow = sourceNode->parent->item->indexOfChild(sourceNode->item);qDebug() << "44444444444444" << targetRow << sourceRow << sourceNode->nodeItemTest << targetNode->nodeItemTest;if (recursiveFindNodeByText(targetNode->nodeText, sourceNode) != nullptr) {//來源節(jié)點(diǎn)中不能有目標(biāo)節(jié)點(diǎn)return;}if (sourceNode->children.isEmpty()) {this->insertChileItem(targetNode->parent, targetRow + 1, sourceNode->nodeItemTest);sourceNode->parent->item->removeChild(sourceNode->item);deleteChildNode(sourceNode->parent, sourceNode->nodeText);}else if (!sourceNode->children.isEmpty()) {TreeNode* newParentNode = this->insertChileItem(targetNode->parent, targetRow + 1, sourceNode->nodeItemTest);for (int i = 0 ; i < sourceNode->children.size(); ++i) {this->RecursionInsert(newParentNode, sourceNode->children.at(i));}//刪除來源itemsourceNode->parent->item->removeChild(sourceNode->item);deleteChildNode(sourceNode->parent, sourceNode->nodeText);}}else if (sourceNode->parent != nullptr && targetNode->parent == nullptr) { //子與父//來源是子節(jié)點(diǎn),指向端是父節(jié)點(diǎn)int targetRow = this->indexOfTopLevelItem(targetNode->item);int sourceRow = sourceNode->parent->item->indexOfChild(sourceNode->item);qDebug() << "222222222222222222" << targetRow << sourceRow << sourceNode->parent->nodeItemTest << sourceNode->nodeItemTest;if (sourceNode->children.isEmpty()) {this->insertTopItem(targetRow + 1, sourceNode->nodeItemTest);sourceNode->parent->item->removeChild(sourceNode->item);deleteChildNode(sourceNode->parent, sourceNode->nodeText);}else if (!sourceNode->children.isEmpty()) {TreeNode* newParentNode = this->insertTopItem(targetRow + 1, sourceNode->nodeItemTest);for (int i = 0 ; i < sourceNode->children.size(); ++i) {this->RecursionInsert(newParentNode, sourceNode->children.at(i));}//刪除來源itemsourceNode->parent->item->removeChild(sourceNode->item);deleteChildNode(sourceNode->parent, sourceNode->nodeText);}}else if (sourceNode->parent == nullptr && sourceNode->children.isEmpty() && targetNode->parent != nullptr) { //空父 與子//來源父節(jié)點(diǎn) 且沒有子節(jié)點(diǎn) 且指向端是子節(jié)點(diǎn)int targetRow = targetNode->parent->item->indexOfChild(targetNode->item);int sourceRow = this->indexOfTopLevelItem(sourceNode->item);qDebug() << "333333333333" << targetRow << sourceRow << sourceNode->nodeItemTest << targetNode->nodeItemTest;this->insertChileItem(targetNode->parent, targetRow + 1, sourceNode->nodeItemTest);this->removeTopItem(sourceNode);}else if (sourceNode->parent == nullptr && !sourceNode->children.isEmpty() && targetNode->parent != nullptr) { //父多子 與子//來源父節(jié)點(diǎn) 有子節(jié)點(diǎn) 且指向端是子節(jié)點(diǎn)if (recursiveFindNodeByText(targetNode->nodeText, sourceNode) != nullptr) {//來源節(jié)點(diǎn)中不能有目標(biāo)節(jié)點(diǎn)return;}int targetRow = targetNode->parent->item->indexOfChild(targetNode->item);int sourceRow = this->indexOfTopLevelItem(sourceNode->item);qDebug() << "5555555555555" << targetRow << sourceRow << sourceNode->nodeItemTest << targetNode->nodeItemTest;TreeNode* newParentNode = this->insertChileItem(targetNode->parent, targetRow + 1, sourceNode->nodeItemTest);for (int i = 0 ; i < sourceNode->children.size(); ++i) {this->RecursionInsert(newParentNode, sourceNode->children.at(i));}//刪除來源itemthis->removeTopItem(sourceNode);deleteNodeByText(sourceNode->nodeText);}} else {// 未找到匹配的節(jié)點(diǎn)qDebug() << "未找到匹配的節(jié)點(diǎn)2";}}//    for (int i = 0; i < m_ListData.size(); ++i) {//        debugTreeData(m_ListData.at(i));//    }
}void MyTreeWidget::paintEvent(QPaintEvent *event)
{// qDebug() << "123123123123";QTreeWidget::paintEvent(event);QPainter painter(viewport());if (m_CurrDragItem != nullptr) {QModelIndex hoveredIndex = indexAt(m_DragMovePos);MyTreeWidgetItem* mcurrMoveItem = dynamic_cast<MyTreeWidgetItem*>(itemFromIndex(hoveredIndex));if (mcurrMoveItem) {QRect rect = visualRect(hoveredIndex); // 獲取懸停項(xiàng)的矩形區(qū)域QString labelText = mcurrMoveItem->m_Label->text();qDebug()<< "---------------" << labelText << rect << "-----------------";painter.setPen(QPen(QColor(34, 142, 243), 2)); // 設(shè)置線條顏色和粗細(xì)// 繪制線條painter.drawLine(rect.x() + 6, rect.y() + rect.height(), rect.x() + rect.width() - 6, rect.y() + rect.height()); // 繪制底部線條// 繪制頭部小圓圈painter.setBrush(QBrush(QColor(34, 142, 243))); // 設(shè)置圓圈顏色painter.drawEllipse(QPoint(rect.x() + 2, rect.y() + rect.height()), 2, 2); // 繪制小圓圈// 繪制尾部小圓圈painter.drawEllipse(QPoint(rect.x() + rect.width()-2, rect.y() + rect.height()), 2, 2); // 繪制小圓圈}}
}void MyTreeWidget::wheelEvent(QWheelEvent *event)
{if (m_WheelEventTemp) {qDebug() << "wheelEvent未結(jié)束就進(jìn)入";return;}if (m_VerticalScrollBar->isSliderDown()) {qDebug() << "正在拖拽滾動條";return;}m_WheelEventTemp = true;qDebug() << "1111111111111111111" << event->angleDelta().y() <<this->topLevelItemCount() << m_VerticalScrollBar->isSliderDown();int number = qAbs(event->angleDelta().y()) / 120;int step = 3; //滾動一次刷新三條數(shù)據(jù)for (int i = 0; i < number; ++i) {if (event->angleDelta().y() > 0) {MyTreeWidgetItem* topItem = dynamic_cast<MyTreeWidgetItem*>(this->topLevelItem(0));TreeNode* topNode = findNodeByText(topItem->getNodeText(), m_ListData);int topIndex = m_ListData.indexOf(topNode);if (topIndex - 3 > 0) {step = 3;}else {step = topIndex;}for (int i = step; i > 0; --i) {//尾部追加顯示//獲取當(dāng)前底部的數(shù)據(jù)topIndex--;updateItem(0, m_ListData.at(topIndex));}for (int i = 0 ; i < step; ++i) {takeTopLevelItem(this->topLevelItemCount() - 1);}if (m_ScrollBarValue > 0) {m_ScrollBarValue -= double(m_VerticalScrollBar->maximum()) / double(m_ListData.size() / (step == 0 ? 1 : step));qDebug() << "向上滾動" << topIndex <<m_ScrollBarValue;m_VerticalScrollBar->setValue(m_ScrollBarValue);}}else {int itemCount = this->topLevelItemCount();MyTreeWidgetItem* bottomItem = dynamic_cast<MyTreeWidgetItem*>(this->topLevelItem(itemCount - 1));TreeNode* bottomNode = findNodeByText(bottomItem->getNodeText(), m_ListData);int bottomIndex = m_ListData.indexOf(bottomNode);if (bottomIndex+3 < m_ListData.size()) {step = 3;}else {step = (m_ListData.size() - 1) - bottomIndex;}for (int i = 0 ; i < step; ++i) {//尾部追加顯示//獲取當(dāng)前底部的數(shù)據(jù)bottomIndex++;updateItem(itemCount, m_ListData.at(bottomIndex));itemCount++;}for (int i = 0 ; i < step; ++i) {takeTopLevelItem(0);}if (m_VerticalScrollBar->value() < m_VerticalScrollBar->maximum()) {m_ScrollBarValue += double(m_VerticalScrollBar->maximum()) / double(m_ListData.size() / (step == 0 ? 1 : step));qDebug() << "向下滾動" << bottomIndex <<m_ScrollBarValue;m_VerticalScrollBar->setValue(m_ScrollBarValue);}}}m_WheelEventTemp = false;
}MyTreeWidgetItem::MyTreeWidgetItem()
{}void MyTreeWidgetItem::setNodeText(QString str)
{m_Text = str;
}QString MyTreeWidgetItem::getNodeText()
{return m_Text;
}MyLabel::MyLabel(QString text, QWidget *parent): QLabel(parent)
{setText(text);installEventFilter(this);enterStyle = "background-color: rgb(225, 243, 255);";leaveStyle = "background-color: white;";selectStyle = "background-color: rgb(204, 232, 255);";
}bool MyLabel::eventFilter(QObject *watched, QEvent *event)
{return QWidget::eventFilter(watched, event);
}
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);m_MyTreeWidget = new MyTreeWidget();//    if (1) {qDebug() << QDateTime::currentDateTime() << "111111111111111";for (int i = 0; i < 100000; ++i) {if (i >= 100) {m_MyTreeWidget->insertTopItem(i, QString("父節(jié)點(diǎn)%1").arg(i+1), false);}else {m_MyTreeWidget->insertTopItem(i, QString("父節(jié)點(diǎn)%1").arg(i+1));}}qDebug() << QDateTime::currentDateTime() << "2222222222222";//    for (int i = 0; i < 500; ++i) {//        m_MyTreeWidget->insertChileItem(m_MyTreeWidget->m_ListData.at(0), m_MyTreeWidget->m_ListData.at(0)->item->childCount(),QString("子節(jié)點(diǎn)%1").arg(i+1));//    }//    for (int i = 0; i < 500; ++i) {//        m_MyTreeWidget->insertChileItem(m_MyTreeWidget->m_ListData.at(1), m_MyTreeWidget->m_ListData.at(1)->item->childCount(),QString("子節(jié)點(diǎn)%1").arg(i+1));//    }//    for (int i = 0; i < 500; ++i) {//        m_MyTreeWidget->insertChileItem(m_MyTreeWidget->m_ListData.at(2), m_MyTreeWidget->m_ListData.at(2)->item->childCount(),QString("子節(jié)點(diǎn)%1").arg(i+1));//    }//    for (int i = 0; i < 500; ++i) {//        m_MyTreeWidget->insertChileItem(m_MyTreeWidget->m_ListData.at(3), m_MyTreeWidget->m_ListData.at(3)->item->childCount(),QString("子節(jié)點(diǎn)%1").arg(i+1));//    }ui->gridLayout->addWidget(m_MyTreeWidget);// 在您的代碼中調(diào)用此函數(shù)來展開所有項(xiàng)//m_MyTreeWidget->expandAllItems(m_MyTreeWidget, m_MyTreeWidget->invisibleRootItem());
}Widget::~Widget()
{delete ui;
}
http://m.aloenet.com.cn/news/37028.html

相關(guān)文章:

  • 深圳疫情最新消息今日情況影視網(wǎng)站怎么優(yōu)化關(guān)鍵詞排名
  • 商務(wù)網(wǎng)站建設(shè)免費(fèi)培訓(xùn)seo
  • 網(wǎng)站建設(shè)phpstudy網(wǎng)站建設(shè)網(wǎng)站定制
  • 在線做h5 的網(wǎng)站東莞免費(fèi)建站公司
  • 網(wǎng)站過期了怎么辦外貿(mào)網(wǎng)站建設(shè)優(yōu)化
  • 國外科技感強(qiáng)的網(wǎng)站站長統(tǒng)計(jì)性寶app
  • 網(wǎng)站建設(shè)業(yè)務(wù)經(jīng)理崗位職責(zé)百度教育網(wǎng)站
  • 網(wǎng)站中間內(nèi)容做多大尺寸的那個(gè)推廣平臺好用
  • 江蘇省建設(shè)廳網(wǎng)站模板建站網(wǎng)頁
  • 湛江網(wǎng)頁設(shè)計(jì)培訓(xùn)性價(jià)比高seo的排名優(yōu)化
  • 中企動力網(wǎng)站站長之家統(tǒng)計(jì)
  • 女人學(xué)ui有前途嗎汕頭seo排名公司
  • 牛街網(wǎng)站建設(shè)2022年最新最有效的營銷模式
  • 天津網(wǎng)站設(shè)計(jì)公司排名優(yōu)幫云排名優(yōu)化
  • 網(wǎng)站手機(jī)端打不開凡科網(wǎng)站登錄入口
  • 淘客手機(jī)網(wǎng)站模板發(fā)布
  • 衡陽縣做淘寶網(wǎng)站建設(shè)內(nèi)存優(yōu)化大師
  • jsp做網(wǎng)站圖片怎么存儲談?wù)勀銓W(wǎng)絡(luò)營銷的認(rèn)識
  • 深圳定制建站鄭州seo多少錢
  • 做網(wǎng)站 分辨率應(yīng)該是多少無錫網(wǎng)站制作優(yōu)化
  • 哪個(gè)網(wǎng)站做的最好百度競價(jià)ocpc投放策略
  • 新聞網(wǎng)站抓取做輿情監(jiān)測河北網(wǎng)絡(luò)推廣技術(shù)
  • 一個(gè)網(wǎng)絡(luò)空間做兩個(gè)網(wǎng)站楚雄今日頭條新聞
  • 徐州自助建站系統(tǒng)google框架三件套
  • 如何做網(wǎng)站域名解析seo推廣軟件品牌
  • 做外鏈網(wǎng)站有哪些廣州seo服務(wù)
  • 網(wǎng)站如何做se外貿(mào)推廣網(wǎng)站
  • 網(wǎng)站建設(shè)期末考試答案跨境電商培訓(xùn)機(jī)構(gòu)哪個(gè)靠譜
  • 地方網(wǎng)站需要什么手續(xù)成免費(fèi)crm軟件有哪些優(yōu)點(diǎn)
  • 中山石岐網(wǎng)站建設(shè)重慶seo建站