QT系列教程(9) 主窗口学习

简介

任何界面应用都有一个主窗口,今天我们谈谈主窗口相关知识。一个主窗口包括菜单栏,工具栏,状态栏,以及中心区域等部分。我们先从菜单栏说起

菜单栏

我们创建一个主窗口应用程序, 在ui文件里的菜单栏里有“在这里输入”的一个菜单,我们双击它输入“文件(&F)”, 这样通过点击alt + F 就可以弹出文件菜单。点击文件菜单,同样会弹出“在这里输入”,我们双击它编辑输入“新建文件(&N)”,可以在右侧的属性栏里为其添加一个图标,同样,我们再添加一个“显示Dock(&D)”的菜单。我们再从左侧的控件Containers里拖动Dock Widget到中心区域,在dock widget中添加一个按钮,一个fontComboBox,一个QTextEdit。DockWidget添加的控件并不会影响主窗口的centralwidget, 我们在centralwidget中添加一个QMdiArea控件。
https://cdn.llfc.club/1665046632168.jpg
我们可以选择Action Editor中的两个action,分别为其添加槽函数,右击actionnew_N选择转到槽,然后选择trigger信号,Qt会自动生成槽函数代码
https://cdn.llfc.club/1665047247148.jpg
同样的道理为显示dock菜单添加槽函数,然后分别实现两个槽函数

void MainWindow::on_actionnew_N_triggered()
{qDebug() << "新建文件..." << endl;QTextEdit * textEdit = new QTextEdit(this);auto childWindow = ui->mdiArea->addSubWindow(textEdit);childWindow->setWindowTitle(tr("文本编辑子窗口"));childWindow->show();
}void MainWindow::on_actionshowdock_triggered()
{qDebug() << "显示dock widget" << endl;ui->dockWidget_2->show();
}

因为QMdiArea是一个多窗口控件,这样我们每次点击新建菜单就会在窗口的中心部件中创建一个子窗口,多次点击会生成多个子窗口。点击显示dock菜单就会显示dockwidget。

我们可以在代码中添加菜单并创建菜单点击后的回调函数

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenu* editMenu = ui->menubar->addMenu(tr("编辑(&E)"));editMenu->addSeparator();QAction * action_Open = editMenu->addAction(QIcon(":/img/head.jpg"), tr("打开文件(&O)"));action_Open->setShortcut(QKeySequence("Ctrl+O"));connect(action_Open,&QAction::triggered, this, &MainWindow::on_action_open_triggered);
}

通过代码我们创建了一个编辑菜单,编辑菜单下有打开文件的动作,设置Ctrl+O为快捷键,并为该动作创建槽函数,然后连结这个槽函数。

void MainWindow::on_action_open_triggered()
{qDebug() << "打开文件..." << endl;
}

所以每次点击打开文件后输出上面的日志。除了可以为菜单栏添加动作外,还可以添加动作组

    //建立动作组QActionGroup * group = new QActionGroup(this);QAction * action_L = group->addAction(tr("左对(&L)"));action_L->setCheckable(true);QAction * action_R = group->addAction(tr("右对(&R)"));action_R->setCheckable(true);QAction * action_C = group->addAction(tr("居中(&C)"));action_C->setCheckable(true);editMenu->addSeparator();editMenu->addAction(action_L);editMenu->addAction(action_R);editMenu->addAction(action_C);

我们也可以自定义动作类,我们接下来自定义一个动作类,动作类包含一个label和lineEdit。自定义的动作类叫MyAction,
声明如下

#ifndef MYACTION_H
#define MYACTION_H#include <QWidgetAction>
#include <QLineEdit>
#include <QObject>
class MyAction : public QWidgetAction
{Q_OBJECT
signals:void getText(const QString& string);public:explicit MyAction(QObject * parent = 0);virtual ~MyAction();
protected:virtual QWidget *createWidget(QWidget *parent);private slots:void sentText();
private://声明行编辑器对象QLineEdit* lineEdit;
};#endif // MYACTION_H

createWidget 为一个虚函数,继承自QWidgetAction, 将Action加入菜单或者工具栏就会调用createWidget函数。接下来我们实现这个类

#include "myaction.h"
#include <QSplitter>
#include <QLabel>MyAction::MyAction(QObject * parent):QWidgetAction(parent){// 创建行编辑器lineEdit = new QLineEdit;// 将行编辑器的按下回车键信号和发送文本槽关联connect(lineEdit, &QLineEdit::returnPressed, this, &MyAction::sentText);
}QWidget* MyAction::createWidget(QWidget * parent){if(parent->inherits("QMenu")|| parent->inherits("QToolBar")){QSplitter * spliter = new QSplitter(parent);QLabel * label = new QLabel;label->setText(tr("插入文本:"));spliter->addWidget(label);spliter->addWidget(lineEdit);return spliter;}return 0;
}void MyAction::sentText()
{emit getText(lineEdit->text());lineEdit->clear();
}

构造函数里创建了一个LineEdit,然后绑定了LineEdit的返回信号,在sentText槽函数里发送了getText信号,然后清除了lineEdit里的内容。createWidget里判断了父节点如果是QMenu或者QToolBar,就创建一个spliter,然后将label和lineedit都加入spliter。在mainwindow的构造函数中创建MyAction,并且加入菜单里。然后将MyAction的getText的信号和MainWindow的setText函数绑定在一起。

    MyAction * action = new MyAction(this);editMenu->addAction(action);connect(action, &MyAction::getText, this, &MainWindow::setText);

MainWindow的槽函数实现如下

void MainWindow::setText(const QString &string){ui->textEdit->setText(string);
}

这样当我们点击编辑菜单弹出我们自己实现的MyAction动作,在输入框里输入文字按下回车后文字就会显示到dockwidget的textedit中。
https://cdn.llfc.club/1665062815744.jpg

工具栏

工具栏相比菜单栏更容易操作,更加直观,添加方式和菜单的方式类似,可以添加label,按钮,以及spinbox等。
可以通过ui添加,也可以通过代码添加,下面用代码添加工具栏菜单。

    //工具栏添加元素QToolButton * toolBtn = new QToolButton(this);toolBtn->setText(tr("颜色"));QMenu* colorMenu = new QMenu(this);colorMenu->addAction(tr("红色"));colorMenu->addAction(tr("绿色"));toolBtn->setMenu(colorMenu);toolBtn->setPopupMode(QToolButton::MenuButtonPopup);ui->toolBar->addWidget(toolBtn);QSpinBox* spinBox = new QSpinBox(this);ui->toolBar->addSeparator();ui->toolBar->addWidget(spinBox);

状态栏

状态栏在窗口的下方,一般在右下方,左下方的为临时的,右下方的为永久的。

void MainWindow::init_status_bar(){//显示临时消息ui->statusbar->showMessage(tr("欢迎使用多文档编辑器"),2000);//创建标签QLabel* permanent = new QLabel(this);permanent->setFrameStyle(QFrame::Box | QFrame::Sunken);permanent->setText("llfc.club");ui->statusbar->addPermanentWidget(permanent);
}

总结

源码链接https://gitee.com/secondtonone1/qt-learning-notes

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

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

相关文章

windows安装conda

1 Conda简介 Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。Conda 是为 Python 程序创建的&#xff0c;适用于 Linux&#xff0c;OS X 和Windows&#xff0c;也可以打包和分发其他软…

Web前端放图片位置:深入探索与最佳实践

Web前端放图片位置&#xff1a;深入探索与最佳实践 在Web前端开发中&#xff0c;图片作为重要的视觉元素&#xff0c;其放置位置往往影响着网页的整体布局和用户体验。然而&#xff0c;如何合理地放置图片&#xff0c;以最大化其视觉效果并提升用户体验&#xff0c;却是一个颇…

mnist的t-SNE二维空间可视化MATLAB

%% filename ‘mnist’; digitDatasetPath fullfile(matlabroot,‘toolbox’,‘nnet’,‘nndemos’, … ‘nndatasets’,‘DigitDataset’); imds imageDatastore(digitDatasetPath, … ‘IncludeSubfolders’,true,‘LabelSource’,‘foldernames’); %% labelCount coun…

【清华大学】《自然语言处理》(刘知远)课程笔记

自然语言处理基础&#xff08;Natural Language Processing Basics, NLP Basics&#xff09; 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言…

RN:Error: /xxx/android/gradlew exited with non-zero code: 1

问题 执行 yarn android 报错&#xff1a; 解决 这个大概率是缓存问题&#xff0c;我说一下我的解决思路 1、yarn doctor 2、根据黄色字体提示&#xff0c;说我包版本不对&#xff08;但是这个是警告应该没事&#xff0c;但是我还是装了&#xff09; npx expo install --…

进军rust:从0开始学习rust语法

一.变量类型 Rust语言中的基础数据类型有以下几种&#xff1a; 1.整数型 整数型简称整型&#xff0c;按照比特位的长度和有无符号位可以分为以下几种 isize和usize两种整数类型是用来衡量数据大小的&#xff0c;它们的位长度取决于所运行的目标平台&#xff0c;如果是32位架…

Springboot+Vue的网上购物商城系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户商家 功能截图

Linux服务器配置一个简单的DNS

配置一个简单的DNS服务器可以使用BIND (Berkeley Internet Name Domain)。 配置DNS的步骤如下 一、安装BIND sudo apt-update sudo apt-get install bind9 二、配置BIND。 编辑 /etc/bind/named.conf.local 文件&#xff0c;添加一个简单的zone配置 zone "example.c…

【机器学习】基于图注意力网络(GAT)的Cora数据集论文主题预测

1. 引言 1.1. GAT概述 GAT是一种基于图神经网络的深度学习模型&#xff0c;专门用于处理图结构数据。与传统的神经网络不同&#xff0c;GAT能够直接对图结构数据进行学习和推理&#xff0c;通过捕捉和传递节点之间的关系和特征信息&#xff0c;实现对图结构数据的深度分析和挖…

GPU风扇不旋转:为什么会发生这种情况以及如何修复

GPU在处理数百万像素时往往会发热,因此冷却风扇静音可能会令人担忧,这是可以理解的!如果你注意到你的GPU风扇没有旋转,下面是如何评估是否存在真正的问题,以及如何解决问题。 风扇停止旋转可能是一个功能,而不是一个Bug 如果GPU没有用于密集任务或没有达到高温,则可以…

使用Spring Boot实现Redis多数据库缓存

Redis多数据库存储实现用户行为缓存 在我的系统中&#xff0c;为了优化用户行为数据的存储与访问效率&#xff0c;我引入了Redis缓存&#xff0c;并将数据分布在不同的Redis数据库中。通过这种方式&#xff0c;可以减少单一数据库的负载&#xff0c;提高系统的整体性能。 主要…

GEE案例——利用MODIS数据(NDVI)计算中国大陆2000-2023年的MK、Sens趋势性分析和Z值统计以及方差分析

简介 利用MODIS数据(NDVI)计算2000-2023年中国大陆的MK、Sens趋势性分析和Z值统计以及方差分析 流程 要进行NDVI数据的趋势性分析和统计分析,需要按照以下步骤进行: 1. 数据准备:获取2000-2023年的MODIS NDVI数据,可以从NASA的MODIS数据网站或其他可靠的数据来源获取…

yarn保姆级安装和使用

目录 前言 一、yarn简介 主要特性 使用场景 二、yarn的安装 yarn的下载 配置环境变量 三、yarn的常用命令 四、yarn的常用配置项 五、npm与yarn的区别 前言 本文旨在介绍如何安装和使用Yarn&#xff0c;以及它的一些常见用法。我们将从Yarn的基本概念开始&#xff0c;…

使用try-with-resources语句替代try-finally语句

Java类库中包含许多必须通过调用close方法手动关闭的资源&#xff0c;例如InputStream、OutputStream和java.sql.Connection。 开发人员经常忽视关闭资源&#xff0c;其性能结果可想而知。 从以往来看&#xff0c;try-finally语句是保证资源正确关闭的最佳方式&#xff0c;即使…

Web前端的规划:深度解构与未来展望

Web前端的规划&#xff1a;深度解构与未来展望 在数字化浪潮汹涌的时代&#xff0c;Web前端作为用户与互联网世界的桥梁&#xff0c;其重要性不言而喻。对于前端开发者而言&#xff0c;一份精心规划的Web前端策略&#xff0c;不仅是项目成功的基石&#xff0c;更是技术进步的引…

Foundation Model 通用大模型的评测体系

随着大模型评测需求逐渐增加,相关研究也进一步深入。大模型相比传统模 型&#xff0c;泛化能力更强、灵活性更高、适应性更广&#xff0c;多任务、多场景&#xff0c;评测维度、评测指标和数 据集更复杂&#xff0c;面向大模型的评估方法、评测基准、测试集成为新的研究课题。 …

Qt图表类介绍

本文主要介绍QCharts相关的模块及类。 Qt中图表模块有以下几种类型&#xff1a;折线图&#xff0c;样条曲线图&#xff0c;面积图&#xff0c;散点图&#xff0c;条形图&#xff0c;饼图&#xff0c;方块胡须图&#xff0c;蜡烛图&#xff0c;极坐标图。 QCharts的图表框架类似…

数据Ant-Design-Vue动态表头并填充

Ant-Design-Vue是一款基于Vue.js的UI组件库&#xff0c;广泛应用于前端开发中。在Ant-Design-Vue中&#xff0c;提供了许多常用的组件&#xff0c;包括表格组件。表格组件可以方便地展示和处理大量的数据。 在实际的开发中&#xff0c;我们经常会遇到需要根据后台返回的数据动…

【Python】Selenium基础入门

Selenium基础入门 一、Selenium简介二、Selenium的安装三、Selenium的使用1.访问web网站2.元素定位根据标签 id 获取元素根据标签 name 属性的值获取元素根据 Xpath 语句获取元素根据标签名获取元素根据CSS选择器获取元素根据标签的文本获取元素&#xff08;精确定位&#xff0…

“论边缘计算及应用”必过范文,突击2024软考高项论文

论文真题 边缘计算是在靠近物或数据源头的网络边缘侧&#xff0c;融合网络、计算、存储、应用核心能力的分布式开放平台(架构)&#xff0c;就近提供边缘智能服务。边缘计算与云计算各有所长&#xff0c;云计算擅长全局性、非实时、长周期的大数据处理与分析&#xff0c;能够在…