QT入门-基本控件

1.QTextEdit 

qt助手查看可知一些信息,其余信息见全文

1.1 functions 

 public function如下:

 使用时通过QT助手查找

实例:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QTextEdit *edit = new QTextEdit(this);edit->resize(200,50);QPushButton *button = new QPushButton(this);QPushButton *input = new QPushButton(this);button->resize(100,50);button->move(50,100);button->setText("输出");input->resize(100,50);input->move(500,100);input->setText("输入");connect(button,&QPushButton::clicked,[=](){//后面一串是为了QString to const string 的转换qDebug()<<edit->toPlainText().toUtf8().data();});connect(input,&QPushButton::clicked,[=](){edit->setText("input context");});
}MainWindow::~MainWindow()
{delete ui;
}

效果: 

1.2 signals 

2.QMainWindow

 QMainWindow是为用户提供界面的主窗口类,包含:

菜单栏(menubar),多个工具栏(toobar),多个铆接部件(dockwidgets浮动窗口),一个状态栏(status),及一个中心部件(centralwidget),是app的基础

eg:文本编辑器,图片编辑器等。

functions:

signals:

slots:
 

2.1 菜单栏(menubar)

 

代码如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QTextEdit *edit = new QTextEdit(this);edit->resize(200,50);edit->move(50,50);QPushButton *button = new QPushButton(this);QPushButton *input = new QPushButton(this);button->resize(100,50);button->move(50,100);button->setText("输出");input->resize(100,50);input->move(500,100);input->setText("输入");connect(button,&QPushButton::clicked,[=](){//后面一串是为了QString to const string 的转换qDebug()<<edit->toPlainText().toUtf8().data();});connect(input,&QPushButton::clicked,[=](){//后面一串是为了QString to const string 的转换edit->setText("input context");});QMenuBar *bar = menuBar(); // 获取或创建菜单栏setMenuBar(bar); // 将菜单栏设置到窗口中// 创建“文件”菜单,并添加一些操作QMenu *fileBar = bar->addMenu("文件(&F)");fileBar->addAction("新建");fileBar->addAction("打开");fileBar->addAction("保存");fileBar->addSeparator(); // 添加一个分隔符// 创建一个子菜单 "最近访问的文件" 并添加一些文件项QMenu *last_file = fileBar->addMenu("最近访问的文件(&R)");last_file->addAction("1.txt");last_file->addAction("2.txt");last_file->addAction("3.txt");// 添加其他菜单bar->addMenu("编辑(&E)");bar->addMenu("View(&V)");bar->addMenu("格式(&M)");
}

效果: 

2.2 工具栏(QToolbar) 

 ​​​​​

  • 工具栏可以随意拖动的,可以放在软件左侧,上侧,下侧,右侧,甚至可以浮动在app的界面中。
  • 工具栏与菜单栏区别:菜单栏只能有一个,且在最上方;而工具栏可以有多个,并且位置多样。因此设置方式为addToolBar

代码如下:

...QToolBar *toolBar = new QToolBar(this);addToolBar(Qt::RightToolBarArea, toolBar);toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);//限制浮动(不限制可以在中间浮动)    toolBar->setFloatable(false);//限制拖拽toolBar->setMovable(true);QAction *newFile = new QAction("新建", this);QAction *openFile = new QAction("打开", this);QAction *saveFile = new QAction("保存", this);toolBar->addAction(newFile);//分割线toolBar->addSeparator();toolBar->addAction(openFile);toolBar->addSeparator();toolBar->addAction(saveFile);

 效果:

2.3添加状态栏(QStatusBar) 

代码如下:

...  // 设置状态栏QStatusBar *statusBar = new QStatusBar(this);setStatusBar(statusBar);// 创建三个标签,用于显示不同的信息QLabel *label1 = new QLabel(u8"人民币汇率:11"); // 使用UTF-8编码的字符串QLabel *label2 = new QLabel("美元汇率:11");     // 普通字符串QLabel *label3 = new QLabel(QStringLiteral("欧元汇率: 11")); // 使用QStringLiteral宏// 将标签添加到状态栏statusBar->addWidget(label1); // 添加到状态栏的左侧statusBar->addWidget(label2); // 也添加到状态栏的左侧statusBar->addPermanentWidget(label3); // 添加到状态栏的右侧,作为永久小部件

效果:

添加状态栏,由于系统的不同,以及中文和中文符号的数量为奇数个的时候易出现乱码

解决方式一,编辑里面重新设置编码规则, 并且有中文的地方前面全部加上u8,即可

 

解决方式二:使用QStringLiteral(),方法,因为内部是Lambda表达式实现,高频次调用影响性能

QLabel *label3 = new QLabel(QStringLiteral("欧元汇率: 11"));

2.4 铆接部件(dockWidget)

   ...// 创建停靠窗口QDockWidget *dockWidget = new QDockWidget(this);// 将停靠窗口添加到主窗口的左侧addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

 效果:

2.5 中心部件(centralWidget)

 

代码如下: 

...// 中心窗口设置为文本编辑器QTextEdit *textEdit = new QTextEdit(this);setCentralWidget(textEdit); // 设置文本编辑器为中心小部件

 效果:

3.UI设计器 

1.基本控件实现 

 1.拖动控件并通过设计器实现connect

2.菜单设置

设置完新的action后,直接拖动action到相应位置 

 2.Qt资源文件添加

资源添加分两种方式:

源码添加,和使用UI设计器添加,比如:一个QAction对象,对它添加图标,还是设置图标,添加代表可以多个,一般来说,一个工具,一个选项卡就是一个图标,因此,我们应该是设置图标,也就是设置icon,那么方法就是set开头,setIcon

1.源码添加方式 

   首先通过设计器设计action,然后使用setlcon添加

 ui->action->setIcon("填写路径"); 

2.UI设计器添加方式 

添加前提需要创建好Resource File,右键工程->add New->Qt->Qt Resource File,新建好工程资源文件,然后把图片资源放入其中 

创建好资源文件后,设置前置和添加图片资源,添加完资源后记得保存 

 

 

保存好,上步添加的资源后,打开UI设计器,我们往 “保存” 这个选项里面添加个icon选择好icon后,在UI设计器里面直接就能看到了 

 

 选择好icon后,在UI设计器里面直接就能看到了

如果添加完资源文件后,我们也可以用代码去访问资源

4.对话框

 虽然我们可以使用QDialog类进行自定义对话框的开发,但是Qt为了方便开发,提供了几种可复用的对话框类型,它们都继承自QDialog类。

Qt内置的对话框包括:

  • QColorDialog 选择颜色对话框
  • QFileDialog 选择文件或目录
  • QFontDialog 选择字体
  • QInputDialog 允许用户输入值,并将其返回
  • MessageBoxDialog 模态对话框,用于显示信息、咨询或警告等

1.QDialog 

 示例代码如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->actiona, &QAction::triggered, [=](){// 构建一个QDialog对象,并在lambda表达式中显示QDialog *dlg = new QDialog(this);dlg->resize(200, 100);dlg->setAttribute(Qt::WA_DeleteOnClose); // 对话框关闭时自动删除dlg->show(); // 显示对话框,但不阻塞其他窗口//dlg->exec(); // 显示对话框,阻塞其他窗口qDebug() << u8"弹出了,新建对话框";});
}

注意点1:

应该使用new在堆上创建变量,否则connect函数执行结束后,局部变量自动销毁了,如果使用非模态,那么程序继续运行,对话框就会转瞬即逝

QDialog *dlg = new QDialog(this);

注意点2:
 记得不用了就delete掉,这里由于无法判断什么时候不用对话框,因此使用setAttribute在对话框关闭时自动删除

dlg->setAttribute(Qt::WA_DeleteOnClose); // 对话框关闭时自动删除

注意点3:

  • 模态:用户交互阻塞在当前对话框
  • 非模态:用户可以跳开当前对话框,在别的对话框交互

 模态:

dlg->exec(); // 显示对话框,阻塞其他窗口

非模态:

dlg->show(); // 显示对话框,但不阻塞其他窗口

2.QMessage 

  • QMessageBox是模态对话框,在app中主要用来提供显示信息,弹出询问,警告等等。例如:我们在记事本中编辑文本,没有保存的时候,就点击关闭,那么app会弹出个QMessageBox对话框,来询问是否保存文本。
  • QMessageBox基于QDialog类的对话框

 

1.静态成员函数复习 

 在C++的类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。

  1. 静态成员函数可以通过类直接调用,而不一定必须通过实例化对象来调用。编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数
  2. 普通成员变量占用对象的内存,静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。
  3. 普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。
  4. 静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数).

2.QMessageBox的静态成员函数使用

QMessageBox静态成员函数如下: 

 

 对于一般的控件我们会这样使用,同时在合适的地方进行delete

    connect(ui->test_QMessageBox,&QPushButton::clicked,[=](){QMessageBox *msg = new QMessageBox;msg->information(this, "通知", "hello");});

 但是对于QMessageBox,我们使用的带的很多成员函数都是静态成员函数,因此没必要这样写,直接调用就行

    connect(ui->test_QMessageBox,&QPushButton::clicked,[=](){
//        QMessageBox *msg = new QMessageBox;
//        msg->information(this, "通知", "hello");QMessageBox::information(this, "通知", "hello");});

效果:
 

 3.正常成员函数

 这些成员函数的调用就要使用new进行,不能直接调用

3.QColorDialog

常用函数也位于静态区

示例代码如下:
 

...connect(ui->choose_color,&QPushButton::clicked,[=](){QColorDialog::getColor(Qt::red, this, "选择颜色");});

效果:

 4.QFileDialog

在Qt助手里面搜索QFileDialog,静态函数区,getOpenFileNamegetOpenFileNames这个就是我们获取文件路径+文件名的两个方法,对文件进行操作,我们只需要获取到路径+文件名即可,: 

静态区:

两个函数,一个不加s返回QString,另一个加s的函数返回一个QStringList,即,一个返回具体文件,一个返回文件列表。

static QString getOpenFileName(QWidget *parent = nullptr,const QString &caption = QString(),const QString &dir = QString(),const QString &filter = QString(),QString *selectedFilter = nullptr,Options options = Options());

对应五个参数:
父类:一般为this
caption:标题
dir:默认路径
selectedFilter:文件筛选,筛选显示后缀符合条件的文件
opthons:文件器,默认即可 

示例代码:

...    connect(ui->getfilename,&QPushButton::clicked,[=](){QFileDialog::getSaveFileName(this,"保存","C:\\","*.txt");});

 效果:

 

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

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

相关文章

【自然语言处理】微调 Fine-Tuning 各种经典方法的概念汇总

【自然语言处理】微调 Fine-Tuning 各种经典方法的概念汇总 前言请看此微调 Fine-TuningSFT 监督微调&#xff08;Supervised Fine-Tuning&#xff09;概念&#xff1a;监督学习&#xff0c;无监督学习&#xff0c;自监督学习&#xff0c;半监督学习&#xff0c;强化学习的区别…

构建高效Docker环境:网络配置全指南

构建高效Docker环境&#xff1a;网络配置全指南 引言Docker网络基础Docker网络概述Docker网络类型Docker网络的重要性 Docker网络配置Bridge网络配置与实践Host和None网络配置的特点与应用Overlay网络的配置及其在集群中的使用 Docker网络命令详解常用网络命令实例讲解 容器间通…

【开源】SpringBoot框架开发APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

【学网攻】 第(25)节 -- 帧中继(多对一)

系列文章目录 目录 系列文章目录 文章目录 前言 一、帧中继是什么&#xff1f; 二、实验 1.引入 实验目标理解帧中继在广域网中的原理及功能&#xff1b; 实验背景 技术原理 实验步骤 实验设备 实验拓扑图​编辑 实验配置 实验验证 文章目录 【学网攻】 第(1)节…

vue3 的setup和生命周期

vue3 的setup和生命周期 许多文章认为setup执行时间在beforeCreate 和created 之间&#xff0c;但是通过实际测试发现setup调用在beforecreate之前。 export default {beforeCreate() {console.log(beforeCreate running....);},created() {console.log("created runnin…

什么是ROAS以及它如何衡量广告活动的有效性

有没有想过您的广告活动效果如何&#xff1f;想想 ROAS&#xff0c;即广告支出回报率。ROAS衡量的是每花一美元广告所产生的收入。虽然 ROAS 是一个强大的指标&#xff0c;可以为我们提供丰富的见解&#xff0c;但不应孤立地考虑它。本文将带你了解什么是 ROAS 以及它如何衡量广…

Python Django路由详解

1.路由Router 在实际开发过程中&#xff0c;一个Django 项目会包含很多的 app&#xff0c;这时候如果我们只在主路由里进行配置就会显得杂乱无章&#xff0c;所以通常会在每个app 里&#xff0c;创建各自的 urls.py 路由模块&#xff0c;然后从根路由出发&#xff0c;将 app 所…

C# OpenVino Yolov8 Pose

目录 效果 模型信息 项目 代码 下载 效果 模型信息 Model Properties ------------------------- date&#xff1a;2023-09-07T17:11:43.091306 description&#xff1a;Ultralytics YOLOv8n-pose model trained on /usr/src/app/ultralytics/datasets/coco-pose.yaml a…

【Make编译控制 06】CMake初步使用

目录 一、概述与安装 二、编译源文件 三、无关文件管理 一、概述与安装 CMake是一个跨平台的项目构建工具&#xff0c;相比于Makefile&#xff0c;CMake更加高级&#xff0c;因为CMake代码在执行的时候是会先翻译生成Makefile文件&#xff0c;再调用Makefile文件完成项目构…

Camunda如何发送邮件及委托代码讲解

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;什么是委托…

力扣 第 383 场周赛 解题报告 | KMP

力扣 第 383 场周赛 解题报告 | KMP 链接 前言 一个人能走的多远不在于他在顺境时能走的多快&#xff0c;而在于他在逆境时多久能找到曾经的自己。 T1 修改矩阵 思路&#xff1a;模拟 时间复杂度&#xff1a; O ( m n ) O(mn) O(mn) class Solution:def modifiedMatrix(se…

二、Mybatis相关概念

1.对象/关系数据库映射&#xff08;ORM) ORM全称Object/Relation Mapping&#xff1a;表示对象-关系映射的缩写ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后&#xff0c;程序员既可以利用面向对象程序设计语言的简单易用性&#xff0c;又可以利用关系数…

leetcode:131.分割回文串

树形结构&#xff1a; 切割到字符串的尾部&#xff0c;就是叶子节点。 回溯算法三部曲&#xff1a; 1.递归的参数和返回值&#xff1a; 参数字符串s和startIndex切割线 2.确定终止条件&#xff1a; 当分割线到字符串末尾时到叶子节点&#xff0c;一种方案出现 3.单层搜索…

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

036 冒泡排序

代码实践 // 冒泡排序 static void bubbleSort(Comparable[] elements) {// 临时容器&#xff0c;用于变量交换值时存储Object temp;// 标志位 用于减少无意义的循环次数boolean flag;for (int i 0; i < elements.length - 1; i) {flag false;for (int j 0; j < elem…

读取csv数据并转为二维数组

首先我csv文件中数据如上&#xff0c;是个25*4的数据。 现在需要读取&#xff0c;并将其转化为二维数组&#xff0c;方便后续操作。 import csv with open(q_table.csv, r) as file:csv_reader csv.reader(file)data_array []for row in csv_reader:data_array.append(row)…

【Effective Objective - C 2.0】——读书笔记(二)

文章目录 前言六、理解“属性”这一概念七、在对象内部尽量直接访问实例变量八、理解“对象等同性”这一概念九、以“类族模式”隐藏实现细节十、在既有类中使用关联对象存放自定义数据十一、理解objc_msgSend的作用十二、理解消息转发机制动态方法解析备援接受者完整的消息转发…

ElasticSearch快速开始

目录 全文检索 全文检索的原理 什么是倒排索引 ElasticSearch介绍 ElasticSearch应用场景 ElasticSearch下载安装&#xff08;windows&#xff09; 客户端Kibana安装 Elasticsearch安装分词插件 ElasticSearch快速开始 ElasticSearch索引操作 创建索引 查询索引 删…

模拟串口LV2,解决硬件串口资源不足问题!!!!

模拟串口通信 2.0 版本&#xff01;&#xff01; 我在前面的文章里面有写了 虚拟串口通信&#xff0c;虽然说能用&#xff0c;但是用过的小伙伴都说 “好!” 优缺点: 先说一点&#xff0c;2.0版本并不适用于同硬件串口的所有场合&#xff0c;仅仅针对自己开发的电子垃圾的主…

中年低端中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安

文章大纲 旅途规划来回行程的确定南宁 - 北海 - 湛江轮渡成为了最终最大的不确定性&#xff01;感谢神州租车气温与游玩地点总体花费 游玩过程出发时间&#xff1a;Day1-1月25日星期四&#xff0c;西安飞南宁路途中&#xff1a;Day2-1月26日星期五&#xff0c;南宁-湛江-住雷州…