当前位置: 首页> 科技> 互联网 > 濮阳市城乡一体化示范区开州街道_营销推广的工具有哪些_网站设计的毕业论文_百度搜索排名靠前

濮阳市城乡一体化示范区开州街道_营销推广的工具有哪些_网站设计的毕业论文_百度搜索排名靠前

时间:2025/7/13 16:18:41来源:https://blog.csdn.net/m0_68739984/article/details/146610326 浏览次数:0次
濮阳市城乡一体化示范区开州街道_营销推广的工具有哪些_网站设计的毕业论文_百度搜索排名靠前

To create a custom QTreeView in C++ using Qt, where users can select multiple nodes and drag them to change their parent nodes, you'll need to leverage Qt's model-view framework along with the drag-and-drop feature. Below is a step-by-step guide to achieving this.

Step 1: Subclass QTreeView and QAbstractItemModel

You'll need to subclass both QTreeView (the view) and QAbstractItemModel (the model). The QTreeView will handle the user interface, and the QAbstractItemModel will manage the data.

Step 2: Create the Custom QTreeView

The custom QTreeView will allow multiple selections and handle drag-and-drop actions.

  1. Subclass QTreeView to enable multi-selection and drag-and-drop:
 

cpp

#include <QTreeView>
#include <QMimeData>
#include <QDrag>
#include <QDropEvent>
#include <QStandardItemModel>
#include <QStandardItem>class CustomTreeView : public QTreeView {Q_OBJECTpublic:CustomTreeView(QWidget *parent = nullptr) : QTreeView(parent) {setSelectionMode(QAbstractItemView::ExtendedSelection); // Allow multi-selectionsetDragDropMode(QAbstractItemView::InternalMove); // Enable drag-and-dropsetDropIndicatorShown(true); // Show drop indicator}void dropEvent(QDropEvent *event) override {// Handle drop event here if needed, like checking validity of dropQTreeView::dropEvent(event);}
};

cpp

Step 3: Create the Model (Subclass QAbstractItemModel)

Next, subclass QAbstractItemModel to represent your data structure. Here’s an example of how you might implement it:

 

cpp

#include <QAbstractItemModel>
#include <QVector>
#include <QVariant>class CustomTreeModel : public QAbstractItemModel {Q_OBJECTpublic:CustomTreeModel(QObject *parent = nullptr) : QAbstractItemModel(parent) {// Sample data: (root, child1, child2)rootItem = new QStandardItem("Root");QStandardItem *child1 = new QStandardItem("Child 1");QStandardItem *child2 = new QStandardItem("Child 2");rootItem->appendRow(child1);rootItem->appendRow(child2);}~CustomTreeModel() {delete rootItem;}int rowCount(const QModelIndex &parent = QModelIndex()) const override {if (!parent.isValid()) {return rootItem->rowCount();}QStandardItem *parentItem = static_cast<QStandardItem*>(parent.internalPointer());return parentItem->rowCount();}int columnCount(const QModelIndex &parent = QModelIndex()) const override {return parent.isValid() ? static_cast<QStandardItem*>(parent.internalPointer())->columnCount() : 1;}QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override {if (role == Qt::DisplayRole) {QStandardItem *item = static_cast<QStandardItem*>(index.internalPointer());return item->text();}return QVariant();}Qt::ItemFlags flags(const QModelIndex &index) const override {Qt::ItemFlags defaultFlags = QAbstractItemModel::flags(index);return defaultFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;}QModelIndex parent(const QModelIndex &index) const override {if (!index.isValid()) {return QModelIndex();}QStandardItem *childItem = static_cast<QStandardItem*>(index.internalPointer());QStandardItem *parentItem = childItem->parent();if (parentItem == rootItem) {return QModelIndex(); // Root node has no parent}return createIndex(parentItem->row(), 0, parentItem);}QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override {if (!parent.isValid()) {return createIndex(row, column, rootItem->child(row));}QStandardItem *parentItem = static_cast<QStandardItem*>(parent.internalPointer());return createIndex(row, column, parentItem->child(row));}private:QStandardItem *rootItem;
};

cpp

Step 4: Integrating Model and View

Now that you have the custom view (CustomTreeView) and model (CustomTreeModel), set them up in your MainWindow or wherever you want to display the tree.

 

cpp

#include <QMainWindow>
#include <QTreeView>
#include <QStandardItemModel>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {// Create the custom tree viewCustomTreeView *treeView = new CustomTreeView(this);treeView->setModel(new CustomTreeModel(this)); // Set the custom modelsetCentralWidget(treeView);}
};

cpp

Step 5: Enable Dragging and Dropping Logic

To support dragging and dropping, the CustomTreeView handles the dragMoveEvent, dragEnterEvent, and dropEvent in the dropEvent method. You may need to add additional logic to handle the rearrangement of nodes.

Step 6: Running the Application

Now, set up the application entry point:

 

cpp

#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

Summary:

  • QTreeView: Subclassed to handle multi-selection and drag-and-drop functionality.
  • QAbstractItemModel: Subclassed to represent the tree data structure.
  • Drag and Drop: Supported by setting the appropriate flags and handling the events in CustomTreeView.

By subclassing QTreeView and QAbstractItemModel, you create a flexible, custom tree view that allows for multi-selection and drag-and-drop functionality. You can further extend the logic to handle additional features like validation, custom item rendering, etc.
//
//
split to .h and .cpp

Sure! Here's the code split into header (.h) and implementation (.cpp) files for a better structure.

CustomTreeView.h

 

cpp

#ifndef CUSTOMTREEVIEW_H
#define CUSTOMTREEVIEW_H#include <QTreeView>
#include <QDropEvent>class CustomTreeView : public QTreeView {Q_OBJECTpublic:explicit CustomTreeView(QWidget *parent = nullptr);protected:void dropEvent(QDropEvent *event) override;
};#endif // CUSTOMTREEVIEW_H

cpp

CustomTreeView.cpp

 

cpp

#include "CustomTreeView.h"
#include <QMimeData>
#include <QDrag>CustomTreeView::CustomTreeView(QWidget *parent) : QTreeView(parent) {setSelectionMode(QAbstractItemView::ExtendedSelection);  // Allow multi-selectionsetDragDropMode(QAbstractItemView::InternalMove);        // Enable drag-and-dropsetDropIndicatorShown(true);                              // Show drop indicator
}void CustomTreeView::dropEvent(QDropEvent *event) {// Handle drop event here if needed (e.g., validate drop)QTreeView::dropEvent(event);
}

cpp

CustomTreeModel.h

 

cpp

#ifndef CUSTOMTREEMODEL_H
#define CUSTOMTREEMODEL_H#include <QAbstractItemModel>
#include <QStandardItem>class CustomTreeModel : public QAbstractItemModel {Q_OBJECTpublic:explicit CustomTreeModel(QObject *parent = nullptr);~CustomTreeModel();int rowCount(const QModelIndex &parent = QModelIndex()) const override;int columnCount(const QModelIndex &parent = QModelIndex()) const override;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;Qt::ItemFlags flags(const QModelIndex &index) const override;QModelIndex parent(const QModelIndex &index) const override;QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;private:QStandardItem *rootItem;
};#endif // CUSTOMTREEMODEL_H

cpp

CustomTreeModel.cpp

 

cpp

#include "CustomTreeModel.h"CustomTreeModel::CustomTreeModel(QObject *parent) : QAbstractItemModel(parent) {// Sample data: (root, child1, child2)rootItem = new QStandardItem("Root");QStandardItem *child1 = new QStandardItem("Child 1");QStandardItem *child2 = new QStandardItem("Child 2");rootItem->appendRow(child1);rootItem->appendRow(child2);
}CustomTreeModel::~CustomTreeModel() {delete rootItem;
}int CustomTreeModel::rowCount(const QModelIndex &parent) const {if (!parent.isValid()) {return rootItem->rowCount();}QStandardItem *parentItem = static_cast<QStandardItem*>(parent.internalPointer());return parentItem->rowCount();
}int CustomTreeModel::columnCount(const QModelIndex &parent) const {return parent.isValid() ? static_cast<QStandardItem*>(parent.internalPointer())->columnCount() : 1;
}QVariant CustomTreeModel::data(const QModelIndex &index, int role) const {if (role == Qt::DisplayRole) {QStandardItem *item = static_cast<QStandardItem*>(index.internalPointer());return item->text();}return QVariant();
}Qt::ItemFlags CustomTreeModel::flags(const QModelIndex &index) const {Qt::ItemFlags defaultFlags = QAbstractItemModel::flags(index);return defaultFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
}QModelIndex CustomTreeModel::parent(const QModelIndex &index) const {if (!index.isValid()) {return QModelIndex();}QStandardItem *childItem = static_cast<QStandardItem*>(index.internalPointer());QStandardItem *parentItem = childItem->parent();if (parentItem == rootItem) {return QModelIndex();  // Root node has no parent}return createIndex(parentItem->row(), 0, parentItem);
}QModelIndex CustomTreeModel::index(int row, int column, const QModelIndex &parent) const {if (!parent.isValid()) {return createIndex(row, column, rootItem->child(row));}QStandardItem *parentItem = static_cast<QStandardItem*>(parent.internalPointer());return createIndex(row, column, parentItem->child(row));
}

cpp

MainWindow.h

 

cpp

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>class CustomTreeView;
class CustomTreeModel;class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow() override;private:CustomTreeView *treeView;CustomTreeModel *model;
};#endif // MAINWINDOW_H

cpp

MainWindow.cpp

 

cpp

#include "MainWindow.h"
#include "CustomTreeView.h"
#include "CustomTreeModel.h"#include <QVBoxLayout>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent),treeView(new CustomTreeView(this)),model(new CustomTreeModel(this)) {treeView->setModel(model);  // Set the custom model to the tree view// Set up the main window layoutsetCentralWidget(treeView);
}MainWindow::~MainWindow() {// Any cleanup if necessary (not strictly needed as Qt handles it)
}

cpp

main.cpp

 

cpp

#include <QApplication>
#include "MainWindow.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

Explanation:

  1. CustomTreeView.h & CustomTreeView.cpp:

    • The view class (CustomTreeView) is set up to allow multi-selection and internal drag-and-drop. The dropEvent method is overridden to handle drops (if needed).
  2. CustomTreeModel.h & CustomTreeModel.cpp:

    • The model class (CustomTreeModel) is a subclass of QAbstractItemModel that provides data for the tree. It manages a root item and its child nodes.
  3. MainWindow.h & MainWindow.cpp:

    • This class initializes the application window and connects the custom tree view with the model.
  4. main.cpp:

    • This file sets up the Qt application and shows the main window.

Compiling and Running:

  • Include the necessary Qt modules (e.g., QtCoreQtGuiQtWidgets) in your .pro file or CMake setup.
  • If you use a .pro file, it might look like this:
    QT += core gui widgets
    SOURCES += main.cpp MainWindow.cpp CustomTreeView.cpp CustomTreeModel.cpp
    HEADERS += MainWindow.h CustomTreeView.h CustomTreeModel.h
    

Now you have a well-structured Qt application that uses a custom tree view with drag-and-drop functionality. Let me know if you need further details or have questions about customization!

关键字:濮阳市城乡一体化示范区开州街道_营销推广的工具有哪些_网站设计的毕业论文_百度搜索排名靠前

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: