qt 5.15.2 主窗体菜单工具栏树控件功能

qt 5.15.2 主窗体菜单工具栏树控件功能

显示主窗体效果:
在这里插入图片描述
mainwindow.h文件内容:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QString>
#include <QMessageBox>

#include <QTreeView>
#include <QFileSystemModel>

#include <QDockWidget>
#include <QLabel>
#include <QPushButton>
#include <QTextEdit>
#include <QToolBar>
#include <QAction>
#include <QFile>
#include <QStandardItemModel>
#include <QResizeEvent>
#include <QDebug>
//

#include "scene.h"

using namespace Qt;

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //
    bool eventFilter(QObject *obj, QEvent *event);
    //void resizeEvent(QResizeEvent *event);


private slots:
    void openImageFile();     //定义卡槽函数
    void TreeDoubleClicked(const QModelIndex &index);
    void on_actionOpen_File_triggered();
    void init_3d();


private:
    Ui::MainWindow *ui;    
    //
    QString currentFile;
    QTreeView* treeView;
    QDockWidget *dockWidget;
    //
    QStandardItem* currentNode;
    QStandardItemModel* model;
    //
    Scene* scene;
    Qt3DExtras::Qt3DWindow* view;
    QWidget *sceneWidget;
};
#endif // MAINWINDOW_H

mainwindow.cpp文件内容:

#include "mainwindow.h"
#include "ui_mainwindow.h"


#include <QFirstPersonCameraController>
#include <QSplitter>
#include <QVBoxLayout>



MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置主界面主题颜色风格(黑灰背景色+白字)
    //this->setStyleSheet ("background-color: rgb(60,60,60);color: rgb(255,255,255);border-color:rgb(230,230,230);");

    //重置窗口
    //resize(600, 400);
    //最大化窗体
    this->setWindowState(Qt::WindowMaximized);

    //创建菜单栏 (只有一个菜单栏)
    QMenuBar *bar = this->menuBar();
    //将菜单栏放入窗口中
    this->setMenuBar(bar);
    //创建菜单项
    QMenu *menuBegin = bar->addMenu("开始");
    QMenu *menuEdit = bar->addMenu("操作");
    QMenu *menuDisplay = bar->addMenu("显示");
    QMenu *menuView = bar->addMenu("视图");
    //创建菜单项
    QAction *build_act = menuBegin->addAction("新建");//给菜单项下面再添加项目
    //添加分隔符
    menuBegin->addSeparator();

    //程序中菜单栏最多有一个
    //QICon *ico=QIcon(":/images/File");

    //添加菜单和工具栏按钮功能并与功能函数绑定
    QString filePath=qApp->applicationDirPath()+"/images/File.ico";
    QAction *act_open_image =menuBegin->addAction(QIcon(filePath),"打开图片文件");
    connect(act_open_image,&QAction::triggered,this,&MainWindow::openImageFile);

    //添加菜单和工具栏按钮功能并与功能函数绑定
    QString openDirPath=qApp->applicationDirPath()+"/images/Open.ico";
    QAction *act_open = menuBegin->addAction(QIcon(openDirPath),"打开文件夹");
    connect(act_open,&QAction::triggered,this,&MainWindow::openImageFile);


    QAction *act_init_3d = menuBegin->addAction(QIcon(openDirPath),"初始化3D");
    connect(act_init_3d,&QAction::triggered,this,&MainWindow::init_3d);


    //工具栏,可以有多个
    QToolBar * toolBar = new QToolBar(this);
    this->addToolBar(toolBar);  // 将工具栏添加
    this->addToolBar(Qt::TopToolBarArea,toolBar);     //出现在top
    //this->addToolBar(Qt::LeftToolBarArea, toolBar);//令其默认出现在左边
    //this->addToolBar(Qt::RightToolBarArea, toolBar);
    //设置允许的停靠范围
    toolBar->setAllowedAreas(Qt::TopToolBarArea);
    //toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);//不会让其停靠在上边,但会浮动
    //设置浮动
    toolBar->setFloatable(false);//禁止浮动
    //设置移动
    toolBar->setMovable(false);//禁止移动
    //工具栏可设置内容
    toolBar->addAction(build_act);//将新建菜单项添加进来,传入的是QAction指针
    toolBar->addSeparator();//添加分割线
    toolBar->addAction(act_open);        //将打开项目添加进来
    toolBar->addAction(act_open_image);  //打开
    toolBar->addAction(act_init_3d);     //初始化3d
    toolBar->addSeparator();
    toolBar->addAction("其他");//传入字符串
    //工具栏添加控件
    QPushButton *p = new QPushButton(this);
    p->setText("自定义的按钮");
    toolBar->addWidget(p);// 添加控件

    //
    //状态栏:最多一个
    QStatusBar * stBar = this->statusBar();
    //设置到窗口
    this->setStatusBar(stBar);
    //QLabel *leftMsg=new QLabel(this->currentFile,this);
    stBar->showMessage(this->currentFile);
    // 放入标签控件
    QLabel *label = new QLabel("提示信息", this);
    stBar->addWidget(label);//放到左侧
    //状态栏设置标签控件位置
    stBar->addPermanentWidget(label);//放到右侧

    //铆接部件(浮动窗口),可以多个
    QDockWidget *dockWidget = new QDockWidget("功能树", this);
    //设置只能移动,不能关闭
    dockWidget->setFeatures(QDockWidget::NoDockWidgetFeatures | QDockWidget::DockWidgetMovable);
    this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);//将浮动窗口默认放到左边


    //设置后期停靠区域,只允许左右
    dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea);
    dockWidget->setFixedWidth(300);
    //设置中心部件
    //QTextEdit *edit = new QTextEdit(this);
    //this->setCentralWidget(edit);

    //菜单栏:set只能一个, 工具栏add可以多个,状态栏set只能一个, 铆接部件add可以多个

    //树控件
    treeView=new QTreeView(dockWidget);
    //treeView->setFixedWidth(300);
    //treeView->setFixedHeight(600);
    // 隐藏标题头
    treeView->setHeaderHidden(true);
    // 禁用节点编辑
    treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    //添加双击事件
    connect(treeView,&QTreeView::doubleClicked,this,&MainWindow::TreeDoubleClicked);

    dockWidget->setWidget(treeView);



    // 设置初始权重以控制初始大小分配
    //QSplitter splitter;
    //splitter.setStretchFactor(0, 1); // QDockWidget 子控件权重为 1
    //splitter.addWidget(dockWidget);
    //splitter.show();


    //QFileSystemModel* fileSystemModel=new QFileSystemModel;
    //fileSystemModel->setRootPath("/");
    //treeView->setModel(fileSystemModel);

    model = new QStandardItemModel(dockWidget);
    treeView->setModel(model);
    QStandardItem* item3d = new QStandardItem("三维模型");
    model->appendRow(item3d);
    //子节点
    QStandardItem* itemOpenShp = new QStandardItem("打开obj文件");
    item3d->appendRow(itemOpenShp);
    //
    QStandardItem* itemVec = new QStandardItem("矢量图层");
    model->appendRow(itemVec);
    //
    QStandardItem* itemImage = new QStandardItem("影像图层");
    model->appendRow(itemImage);
    //
    QStandardItem* itemMarker = new QStandardItem("标注信息");
    model->appendRow(itemMarker);
    //

    //scene  3d
    view = new Qt3DExtras::Qt3DWindow();
    sceneWidget = QWidget::createWindowContainer(view);
    scene = new Scene(view);
    view-> installEventFilter(this);

    // 添加布局管理   treeView的高宽与QVBoxLayout布局自动变化
    QWidget *centralWidget = new QWidget();
    //QVBoxLayout *layout = new QVBoxLayout(centralWidget);
    QHBoxLayout *layout = new QHBoxLayout(centralWidget);
    layout->addWidget(dockWidget);   //树控件
    layout->addWidget(sceneWidget);  //3d地图控件
    this->setCentralWidget(centralWidget);
    //
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress){
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        scene->KeyControls(keyEvent);
    }
    return QObject::eventFilter(obj, event);
}

/*
void MainWindow::resizeEvent(QResizeEvent *event)
{
    treeView->setFixedWidth(dockWidget->width());
    treeView->setFixedHeight(dockWidget->height());
    //qDebug()<<"resize: "<<event->size();
    this->update();
}*/

//打开文件 menu/toolbar
void MainWindow::openImageFile()
{
    QString filename= QFileDialog::getOpenFileName(this,"Open file");
    QFile file(filename);
    currentFile = filename;
    if (!file.open(QIODevice::ReadOnly)) {
        QMessageBox::warning(this,"Warning", "Cannot open "+file.errorString());
    }
    setWindowTitle(filename);
    //添加3d file
    QUrl fUrl=QUrl("file://"+filename);
    Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh();
    mesh->setSource(fUrl);

    Qt3DCore::QEntity *entity = new Qt3DCore::QEntity();
    entity->addComponent(mesh);

    Qt3DExtras::QFirstPersonCameraController *cam=new Qt3DExtras::QFirstPersonCameraController(entity);
    cam->setCamera(view->camera());

    view->setRootEntity(entity);

    //view->camera()->viewAll();



}

//打开文件 tree pad/open
void MainWindow::on_actionOpen_File_triggered()
{
    QString filename= QFileDialog::getOpenFileName(this,"Open file");
    QFile file(filename);
    currentFile = filename;
    if (!file.open(QIODevice::ReadOnly)) {
        QMessageBox::warning(this,"Warning", "Cannot open "+file.errorString());
    }
    setWindowTitle(filename);
    //
    Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh();
    QUrl data =QUrl::fromLocalFile(filename);
    mesh->setSource(data);

    qDebug()<<"mesh status="<<mesh->status();

    //获取视图的大小
    //QSize screenSize = view->size();
    sceneWidget->setMinimumSize(QSize(10, 10));//最小
    sceneWidget->setMaximumSize(QSize(5000, 5000));//最大

    scene->NewScene(mesh);

    Qt3DExtras::QFirstPersonCameraController *cam=new Qt3DExtras::QFirstPersonCameraController(scene->rootEntity);
    cam->setCamera(view->camera());


}

void MainWindow::init_3d()
{
    scene->init3d();

    Qt3DExtras::QFirstPersonCameraController *cam=new Qt3DExtras::QFirstPersonCameraController(scene->rootEntity);
    cam->setCamera(view->camera());
}

void MainWindow::TreeDoubleClicked(const QModelIndex &index)
{
    // 获取当前选中节点索引
    QModelIndex currentIndex = treeView->currentIndex();
    if (currentIndex.isValid()) {
        // 执行相关操作,例如获取节点信息或执行其他操作
        this->currentNode = model->itemFromIndex(currentIndex);
        if(this->currentNode->text()=="打开obj文件")
        {
             this->on_actionOpen_File_triggered();
        }
        else
        {
            //qDebug() << "Current selected item text:" << currentItem->text();
            QMessageBox::information(this,"提示信息", this->currentNode->text());
        }
    } else {
        //qDebug() << "No item selected";
        QMessageBox::information(this,"提示信息", "未选中节点");
    }
}

本blog地址:https://blog.csdn.net/hsg77

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/224196.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈web性能测试

什么是性能测试&#xff1f; web性能应该注意些什么&#xff1f; 性能测试&#xff0c;简而言之就是模仿用户对一个系统进行大批量的操作&#xff0c;得出系统各项性能指标和性能瓶颈&#xff0c;并从中发现存在的问题&#xff0c;通过多方协助调优的过程。而web端的性能测试…

ChatGPT能帮助--掌握各种AI绘图工具,随意生成各类型性图像

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

〖大前端 - 基础入门三大核心之JS篇㊼〗- BOM基础之window对象

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

Caché/M 数据库系统 InterSystems IRIS 的 Windows 安装

针对 InterSystems IRIS 数据库的一些基本概念。 InterSystems IRIS 是什么 InterSystems IRIS 是基于 Cach/M 语言开发的一个数据库&#xff0c;这个数据库被大量使用在医疗系统中&#xff0c;也是北美地区医疗系统病历和文件管理中默认使用的事实标准。 Cach/M 是什么 Ca…

亚马逊云科技Serverless视频内容摘要提取方案

概述 随着GenAI的普及&#xff0c;视频内容摘要生成成为一个备受关注的领域。通过将视频内容转化为文本&#xff0c;可以探索到更广泛的应用场景&#xff0c;其中包括&#xff1a; 视频搜索与索引&#xff1a;将视频内容转化为文本形式&#xff0c;可以方便地进行搜索和索引操作…

Zabbix自定义飞书webhook告警媒介2

说明:适用于7.0及以上版本,低版本可能会有问题。 参数如下: 名称 值EVENT.DURATION{EVENT.DURATION}EVENTDATE

AWS re:Invent 2023-亚马逊云科技全球年度技术盛会

一:会议地址 2023 re:Invent 全球大会主题演讲 - 亚马逊云科技从基础设施和人工智能/机器学习创新,到云计算领域的最新趋势与突破,倾听亚马逊云科技领导者谈论他们最关心的方面。https://webinar.amazoncloud.cn/reInvent2023/keynotes.html北京时间2023年12月1日00:30-02:…

Java架构师系统架构设计原则应用

目录 1 导语2 如何设计高并发系统:局部并发原则3 如何设计高并发系统:服务化与拆分4 高可用系统有哪些设计原则?5 如何保持简单轻量的架构-DRY、KISS,YAGNI原则6 如何设计组件间的交互和行为-HCLC,CQS,SOC7 框架层面的发展趋势-约定大于配置想学习架构师构建流程请跳转:…

一v一聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

mysql5.7安装详细教程

文章目录 1 引言1.1 现有的数据存储方式有哪些&#xff1f;1.2 以上存储方式存在哪些缺点&#xff1f; 2 数据库2.1 概念2.2 数据库的分类 3 数据库管理系统3.1 概念3.2 常见数据库管理系统 4 MySQL4.1 简介4.2 访问与下载4.3 安装4.3.1 解压缩到非中文目录4.3.2 编写配置文件4…

华为数通---配置端口安全案例

端口安全简介 端口安全&#xff08;Port Security&#xff09;通过将接口学习到的动态MAC地址转换为安全MAC地址&#xff08;包括安全动态MAC、安全静态MAC和Sticky MAC&#xff09;&#xff0c;阻止非法用户通过本接口和交换机通信&#xff0c;从而增强设备的安全性。 组网需…

GitHub工业级开源软件:基于网络的过程可视化(SCADA/HMI/仪表板)

GitHub工业级开源软件:基于网络的过程可视化(SCADA/HMI/仪表板)  作者:本站编辑  2023-11-25 06:52:35  117 大家好,我是 Fun-Fun君,每天介绍github上最有价值的开源项目 今天介绍 FUXA 基于网络的过程可视化(SCADA/HMI/仪表板)软件 github地址:…

unity 2d 入门 飞翔小鸟 飞翔动作动画描点(六)

1、创建文件夹新建动画控制器 右键->create->Animator controer 给图层创建动画 把创建后的动画控制器拖拽至对应图层 点击window->Animation->Animation 点击创建文件夹 把图片拖拽到这里面&#xff0c;就可以了 然后我们就看在player看到已经把动作挂上去 点…

【Openstack Train】十六、swift安装

OpenStack Swift是一个分布式对象存储系统&#xff0c;它可以为大规模的数据存储提供高可用性、可扩展性和数据安全性。Swift是OpenStack的一个核心组件&#xff0c;它允许用户将大量的数据存储在云上&#xff0c;并且可以随时访问、检索和管理这些数据。 Swift的设计目标是为了…

外置固态硬盘配置

1、插上usb外置硬盘盒 2、邮件我的此“电脑”选择“管理” 3、例如新增的固态硬盘如下&#xff1a; 4、这里我选择mrb(旧模式)而没选guid(新模式) 因为mrb兼容模式更加适合windows、ios等系统 5、右击未分区磁盘&#xff0c;选择新增卷区&#xff0c;一路下一步即可

华为数通---BFD多跳检测示例

定义 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网络设备需要…

【Linux 进度条小程序】缓冲区+回车换行

文章目录 回车与换行缓冲区举个栗子fflush函数倒计时小程序进度条小程序 回车与换行 回车和换行是不同的两个概念 回车&#xff1a;\r 使光标回到本行行首。 换行&#xff1a;\n使光标下移一格。 一般我们的键盘上的Enter键是回加换行键 在c语言中 \n 表示回车换行 效果和Ent…

IDEA Maven项目如何引用本地jar包,并打包发布

jar包位于当前路径下的lib目录中 引入所需要的配置 查看当前jar包的相关信息 包的引入,需要使用到当前包的artifactId, groupId, version 需要到包的/META-INF/maven/ 下面的 pom.xml 文件里面找 在Maven构建项目时&#xff0c;生成的依赖包中的/META-INF/maven目录存放了一些…

华为数通---使用基本ACL限制Telnet登录权限案例

组网需求 如下图所示&#xff0c;PC与设备之间路由可达&#xff0c;用户希望简单方便的配置和管理远程设备&#xff0c;可以在服务器端配置Telnet用户使用AAA验证登录&#xff0c;并配置安全策略&#xff0c;保证只有符合安全策略的用户才能登录设备。 配置通过Telnet登录设备…

ALPHA开发板烧录工具MfgTool烧写方法

一. 简介 MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件&#xff0c;可以在 NXP 官网下载到。运行在windows下。可以烧写uboot.imx、zImage、dtb&#xff0c;rootfs。通过 USB口进行烧写。 上一篇文章简单了解了 ALPHA开发板烧录工具MfgTool。文章地址…
最新文章