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

news2024/11/27 21:01:28

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.coloradmin.cn/o/1291489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Sentinel系列-2.Sentinel原理及核心源码分析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

CAP理论详解

引言 随着分布式系统在现代应用中的广泛应用&#xff0c;工程师们不得不面对诸如数据一致性、可用性和分区容错性等问题。CAP定理作为分布式系统设计的基石之一&#xff0c;为我们提供了在这些问题之间做出权衡的理论依据。本文将深入探讨CAP定理的技术细节、先进性&#xff0…

深度学习记录--广播(Broadcasting)

什么是广播&#xff1f; 广播(Broadcasting)&#xff0c;在python中是一种矩阵初等运算的手段&#xff0c;用于将一个常数扩展成一个矩阵&#xff0c;使得运算可行 广播的作用 比如&#xff1a; 一个1*n的矩阵要和常数b相加&#xff0c;广播使得常数b扩展成一个1*n的矩阵 …

mysql的几种索引

mysql索引的介绍可以mysql官网的词汇表中搜索&#xff1a; https://dev.mysql.com/doc/refman/8.0/en/glossary.html mysql可以在表的一列、或者多列上创建索引&#xff0c;索引的类型可以选择&#xff0c;如下&#xff1a; 普通索引&#xff08;KEY&#xff09; 普通索引可…

SQLserver截取字符串

当我们存的数据是json的时候可以全部取出在模糊查询但是有多个重复数据的时候就没办法准确的模糊出来这个时候我们就需要用的字符串截取 --创建函数create FUNCTION [dbo].[Fmax] (str varchar(50),start VARCHAR(50),length VARCHAR(50)) RETURNS varchar(max) AS BEGINDEC…

McBSP接口概念和使用

copy McBSP包括一个数据通道和一个控制通道&#xff0c;通过7个引脚与外部设备连接。数据发送引脚DX负责数据的发送&#xff0c;数据接收引脚DR负责数据的接收&#xff0c;发送时钟引脚CLKX&#xff0c;接收时钟引脚CLKR&#xff0c;发送帧同步引脚FSX和接收帧同步引脚FSR提供…

Python语言基础知识(一)

文章目录 1、Python内置对象介绍2、标识符与变量3、数据类型—数字4、数据类型—字符串与字节串5、数据类型—列表、元组、字典、集合6、运算符和表达式7、运算符和表达式—算术运算符8、运算符和表达式—关系运算符9.1、运算符和表达式— 成员测试运算符in9.2、运算符和表达式…

外贸平台自建站的教程?做海洋建站的好处?

外贸平台自建站怎么做&#xff1f;搭建网站的具体流程有哪些&#xff1f; 作为外贸从业者&#xff0c;借助互联网平台自建站点已经成为推广业务、拓展市场的一种重要手段。海洋建站将为您提供一份详尽的外贸平台自建站的教程&#xff0c;助您在网络空间中展现您的企业魅力。 …

RocketMQ-RocketMQ⾼性能核⼼原理分析

一、源码环境搭建 1、主要功能模块 ​ RocketMQ的官方Git仓库地址&#xff1a;https://github.com/apache/rocketmq 可以用git把项目clone下来或者直接下载代码包。 ​ 也可以到RocketMQ的官方网站上下载指定版本的源码&#xff1a; http://rocketmq.apache.org/dowloading/…

新能源车交直流充电解释

交流充电&#xff1a; 国家电网输出的电都是交流电&#xff0c;如下图所示&#xff0c;具有正弦切换规律的 而电动车的电池只能接受直流电&#xff0c;因此需要首先把交流电转换成直流电才能充进汽车电池&#xff0c;这就需要到了转换器OBC&#xff08;on-board Charger&#…

PPOCRv3检测模型和识别模型的训练和推理

PPOCRv3检测模型和识别模型的训练和推理 文章目录 PPOCRv3检测模型和识别模型的训练和推理前言一、环境安装1&#xff0c;官方推荐环境&#xff1a;2&#xff0c;本机GPU环境 二、Conda虚拟环境1.Win10安装Anaconda32.使用conda创建虚拟环境 三、安装PPOCR环境1&#xff0c;安装…

基于ssm人事管理信息系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本人事管理信息系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

跨境电商危机公关:应对负面舆情的策略优化

随着跨境电商的快速发展&#xff0c;企业在全球市场中面临的竞争与挑战也日益复杂。在这个数字时代&#xff0c;负面舆情一旦爆发&#xff0c;可能对企业形象和经营造成深远影响。 因此&#xff0c;跨境电商企业需要建立有效的危机公关策略&#xff0c;以迅速、果断、有效地应…

Vue + Element 实现按钮指定间隔时间点击

1、业务需求 需要加一个按钮&#xff0c;调用第三方API&#xff0c;按钮十分钟之内只能点击一次&#xff0c;刷新页面也只能点击一次 2、思路 加一个本地缓存的时间戳&#xff0c;通过时间戳计算指定时间内不能点击按钮 3、实现 1&#xff09;vue页面 <template>&l…

angular项目怎么给iframe动态赋值

前段时间在做项目的时候&#xff0c;给项目嵌入了一个第三方的ai链接&#xff0c;之前写成一个死的链接&#xff0c;测试都正常&#xff0c;但是后期迭代的时候将链接后面动态添加了一个参数&#xff0c;发现iframe不出来&#xff0c;并且查看dom结构&#xff0c;直接src对应的…

python中通过print输出信息

直接输出信息 例如&#xff1a; print("hello python")通过逗号将变量分割 例如&#xff1a; age 12 print("age is ", age)输出&#xff1a; 使用%占位符 例如&#xff1a; age 12 print("age is %d" %age)输出&#xff1a; 用f格式…

备战2024前端春招,你准备好了吗?(附10万字答案解析)

1. 前端知识体系 在说前端面试体系之前&#xff0c;先来看一下之前整理的前端知识体系图&#xff08;可能不太完整&#xff0c;毕竟我只是一个刚毕业一个多月的小菜鸡&#xff09;&#xff0c;这只是一个基础版的前端知识体系图&#xff0c;适合刚入门前端的小伙伴参考&#x…

openeuler安装深度桌面dde

安装深度开发的桌面dde sudo dnf makecachesudo dnf install ddesudo systemctl set-default graphical.target重启系统 reboot

JPA与MySQL锁实战

前言&#xff1a;最近使用jpa和mysql时&#xff0c;遇到了死锁问题。在解决后将一些排查过程中新学到和复习到的知识点再总结整理一下。首先对InnoDB中锁相关的概念进行介绍&#xff0c;然后展示如何利用JPA提供的排他锁来实现想要的功能&#xff0c;最后对死锁问题进行讨论。 …

【EI会议征稿】第三届密码学、网络安全和通信技术国际会议(CNSCT 2024)

第三届密码学、网络安全和通信技术国际会议&#xff08;CNSCT 2024&#xff09; 2024 3rd International Conference on Cryptography, Network Security and Communication Technology 随着互联网和网络应用的不断发展&#xff0c;网络安全在计算机科学中的地位越来越重要&…