qt 系列(一)---qt designer设计常用操作

news2024/11/16 17:47:27

最近转战qt, 主要用qt designer 进行GUI开发,记录下实战经验~

1.前言

qt 是跨平台C++图形用户界面应用程序开发框架,可以使用的IDE工具有 qt creator 和 vs, 这里我主要使用 Visual Studio 2017 工具进行程序开发与编写。

2. 环境配置

只写关键步骤~~

(1)安装vs2017+ qt5.9

[Visual Studio Community] 免费使用,到期之后注册登录下就可以永久使用,下载地址:https://visualstudio.microsoft.com/zh-hans/free-developer-offers/ 。
安装时,选择工作负载勾选使用c++的桌面开发,并将C++/CLI支持勾选。
若是windows8,将Windows8.1 SDK 和 UCRT SDK勾选;
若是windows10,勾选windows10 SDK 、 Windows8.1 SDK 和 UCRT SDK。

qt 下载地址:https://download.qt.io/archive/qt/
安装过程略

(2)vs2017 配置qt

  1. 安装完qt 和 vs之后,需要在vs2017中配置下qt
  2. vs2017 工具–扩展与更新 搜索qt,进行下载与安装Qt VS Tools
  3. 重新启动VS2017,菜单栏会出现 QT VS Tools
  4. Qt VS Tools --Qt Version 中配置qt ,D:\app\Qt\Qt5.9.9\5.9.9\msvc2017_64 改成自己安装的路径
3. 项目导入

3.1 QT VS Tools 导入 .pro 文件

QT VS Tools 中导入 QT 文件是导入.pro文件, 是初始化配置文件;如果新增了.ui /.qrc需要在.pro文件中添加,打开.pro文件时才会默认加载;或者直接通过文件打开.vcxproj, 会加载最新配置。

在这里插入图片描述

3.2 通过.sln 打开解决方案

VS2017 文件–打开–项目/解决方案 , 打开的是 .sln文件

3.3 打开别人的.sln项目时,一般需要配置

  1. 右键项目–选择属性
  2. 常规–Windows SDK版本,选择自己已经安装的sdk版本[10.0.17763.0]
  3. 常规–平台工具集,选择已经安装的平台工具集[Visual Studio 2017 (v141)]
  4. Qt Project Settings–Qt Installation, 选择自己安装的[qt2017_64]
  5. C/C++ --常规,配置相应的附加包含目录(include 和 lib 文件)
  6. 链接器–常规,配置相应的附加库目录
  7. 链接器–输入。配置附加依赖项(lib文件)
4.项目目录结构

在这里插入图片描述

外部依赖项: 自动加载编程中引入的文件,一般不需要修改;
Form Files: 存放 .ui 文件;
Header Files:存放 .h 文件;
Resource Files: 存放资源文件,最常见的是.png文件,用于ui 设计,添加样式表-自定义背景图片;
Source Files: 存放 .cpp 源文件

4.1 UI 界面设置
项目文件中 Form Files 文件中存放 .ui文件, 可以基于此文件在Qt Designer窗口中进行UI设计

(1) .ui文件打不开或闪退的原因:不能使用原来默认的打开方式,打开方式要选择自己安装的qt designer.exe文件。
(2) 修改了ui 文件, vs工程中没有及时同步,可以先选中ui文件进行编译,编译之后在重新生成解决方案就可以使用最新的ui文件了, 若还是不可以,需要重新打开项目。

5.qt designer 设计常用操作

.ui 文件一旦创建,不要随意修改其名称,否则容易报错

  1. 创建ui文件
    选择Form Files–添加–新建项–Qt–Qt MainWindow Form File/Qt Widget Form File/Qt Dialog Form File 创建对应的窗口文件。其中MainWindow Form File自带 菜单栏,工具栏和状态栏,根据需求进行创建。
  2. qt designer 常用工具:属性编辑器, 对象查看器,动作编辑器,信号/槽编辑器,资源浏览器;
  3. 修改窗口名称:属性:windowTitle ;在对象查看器中点击窗口类对象,在属性编辑器中搜索即可找到,可以修改窗口名称;
  4. MainWindow 窗口改变菜单栏/子菜单顺序,直接拖拽;
  5. 改变MainWindow 菜单背景颜色:对象查看器中点击菜单menubar,然后去属性编辑器中进行改变样式表(styleSheet):
    background-color: rgb(34, 68, 102); //背景颜色
    color:rgb(255, 255, 255) //字体颜色
  6. MainWindow 添加工具栏:直接将动作编辑器拖拽到工具栏即可;对象查看器:QToolBar --属性编辑器:toolButtonStyle 选择ToolButtonTextBesideIcon,可以设计图标和文本一起显示;
  7. QToolBar 添加资源图像时要建立.qrc文件导入项目中,否则图标容易加载失败;
  8. layout无法改变样式表,可以先将layout变成Wiget,然后再针对背景\控件添加颜色(改变样式表),
    font: 25 10pt “Microsoft YaHei” ; //字体样式
    font: Bold; // 字体加粗
    color:rgb(144, 187, 255) //颜色
  9. 控件随窗口大小而变化:一开始布局为栅格布局,充满整个窗口, 在栅格布局中进行各种类型的布局,布局完成时选择 栅格布局,控件便可以随窗口变化而变化;
  10. 同一窗口显示不同界面: Container–>Tab Widget/Stacked Widget ,修改tab名称:currentTabText
    border-width:0;border-style:outset 无边框
    font: 25 9pt “Microsoft YaHei UI Light”;
  11. Container–>Scroll area 没有出现滚动条 :scrollArea < scrollAreaWidgetContents; 勾掉widgetResizable
  12. label 字体加粗(样式表): font-weight: bold
  13. LineEdit默认设置垂直策略为Fixed, 所以一定其垂直框中一定加弹簧,不然,界面显示间隔控件很大,很难看
  14. 信号与槽:信号指动作, 槽指函数;
    内置控件函数:可以通过qt designer直接调用: Edit–>编辑信号/槽,可以进行控件内置函数建立信号与槽的连接;
    自定义槽函数,需要先在主文件.h中定义成员函数,然后在.cpp中实现函数功能,最后connect实现跳转。注:函数名不得与类名重复。
xxx.h中:
private slots:
	void test();
};


.cpp中: 需要先引入#include "xxx.h"文件
void XxxWindow::test()
{
	GuidWidget* guid = new GuidWidget();
	guid -> show();  //展示某个页面
}


//在qt designer中添加信号与槽函数,不可在.c文件中重复添加,否则容易触发两遍
connect(ui->actionGuide, SIGNAL(triggered()), this, SLOT(test()));
6.编程常用语句
  1. 页面切换:stackedWidget 切换页面:ui->stackedWidget->setCurrentIndex(0);获取第一页;
//绑定按钮进行切换
connect(ui->pushButton, &QPushButton::clicked, [this]() {ui->stackedWidget->setCurrentIndex(1); });
  1. 按钮置灰不可点击:
ui->pushButton_2->setEnabled(false);
  1. qt designer Qlabel text 等于lineEdit 值:
ui->label_12->setText(ui->lineEdit_2->text())
  1. qt designer setText()中文乱码 : QString::fromLocal8Bit
setText(QString::fromLocal8Bit("完成"))
  1. if 语句相等判断条件,注意乱码影响 :ui->pushButton_5->text() == QString::fromLocal8Bit(“完成”),如果不这么写,乱码对比,等式永不成立。
  2. lineEdit 值设置为变量(j)+固定值:
QString new_j = QString::number(j) ;  //int 转 QString
lineEdit->setText(QString::fromLocal8Bit("站点" )+ new_j);  //j 也需要是QString类型
  1. QMessageBox: 生成消息对话框
QMessageBox::information(this, "Title", QString::fromLocal8Bit("确定删除此项目! "));
  1. setStretch()方法指定了包含在该布局中的行或列所占据的窗口部件在该行或该列中所被拉伸的比例
horizontalLayout_42->setStretch(0, 1); 代表第1列占比1份;0代表第1列/行,1代表占比
  1. 输出变量:qDebug() << a
  2. qt 将内容打印到日志文件:
#include<fstream>
std::ofstream fout("out.log"); //输出到 out.log文件
std::cout.rdbuf(fout.rdbuf());  //初始化
std::cout << "11111111" << std::endl; //输出的内容
  1. QString之simplified() :函数把一个字符串首尾的空格不可见字符全部清除,字符串中间的空格(包括单个空格、多个空格、‘\t’, ‘\n’, ‘\v’, ‘\f’, ‘\r’, and ’ ')都统一转化成一个空格。
例:
QString a =" a b    c  d   "; 
a.simplified(); -->输出 :"a b c d"
  1. 信号与槽
    (1)pushbutton 与 QAction 连接槽函数:
    triggered() 与 clicked() 的区别:
    clicked():一般指点击、按下,用于Button发射的信号;
    triggered():QAction等的触发;
    activated():一般指控件被激活(激活原因可以有很多);
    toggle(): 用于ChekBox,非开即关;在Qt中,checkable按纽或是图标的槽函数应该用toggled()事件来激活。
动作编辑器触发自定义槽函数:
connect(ui->actionSaveAs, SIGNAL(triggered()), this, SLOT(saveProject()));

按钮触发自定义槽函数
connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(setSite()));

按钮触发内置槽函数
connect(ui->pushButton_5, &QPushButton::clicked, [this]() {});

当函数名命名为: on_pushbutton对象名_clicked()时,无需写connect,也可以触发;
  1. 获取QLineEdit更新后的值
    当我们更新了Line Edit控件中的值时,我们希望获取最新的值,可以使用textEdited()信号, 意思是text内容编辑时产生信号。
    例如:当修改Line Edit 内容时,我们获取最新值
connect(QLineEdit_test, SIGNAL(textEdited(const QString&)), this, SLOT(test()));  //可以获取QLineEdit更新后的值
//自定义槽函数
QString  newProject::test() {
	value_edit = QLineEdit_test->text(); //QLineEdit 为edit控件对象名称
	return value_edit;
}
  1. 清空horizontalLayout布局内的所有元素
    QLayoutItem *child;
	while ((child = ui-> horizontalLayout_test->takeAt(0)) != 0)   //ui-> horizontalLayout_test 为对应的horizontalLayout
	{
		//setParent为NULL,防止删除之后界面不消失
		if (child->widget())
		{
			child->widget()->setParent(NULL);
		}

		 delete child;
	}
  1. 删除Tab Widget的某一页 tab
    int temp_tabCount = ui->tabWidget_test->count() - 1;  //ui->tabWidget_test 为tab控件对象名称,,计算此控件下共有多少Tab页;

	for (int i = temp_tabCount; i >= 2; i--)  //仅留一页tab
	{
		qDebug() << " remove tab: " << i;
		ui->tabWidget_test->removeTab(i);  //删除tab页

	}
7. qt 打包成exe 文件发布

qt debug 下的 exe 可以直接运行吗?不能单纯的copy exe文件,需要进一步打包成文件:(有待验证)
(1)将qt release 文件夹下的 .exe文件单独copy到新建文件夹下
(2)打开 Qt5.9.9(MSVC 2015 32-bit ) ,安装qt时自动安装,版本有所不同
(3)Qt5.9.9(MSVC 2015 32-bit ) 切换到新建文件夹目录路径
(4)输入命令 windeployqt 程序名 回车,将所需的库文件copy到exe文件夹下
(5)双击可以运行,可以打包压缩发给其他用户使用

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

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

相关文章

Java 谈谈你对OOM的认识

文章目录 前言一、基础架构二、常见OOM1、栈内存溢出java.lang.StackOverflowError2、堆内存溢出java.lang.OutOfMemoryError&#xff1a;Java heap space3、GC回收时间过长java.lang.OutOfMemoryError: GC overhead limit exceeded4、NIO程序堆外内存溢出java.lang.OutOfMemor…

MySQL使用存储过程迁移用户表数据,过滤用户名相同名称不同的用户

存储过程简介 存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中&#xff0c;用户通过指定存储过程的名字并给定参数&#xff08;如果该存储过程带有参数&#xff09;来调用执行它。它是一段预编译的SQL…

openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema

文章目录 openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema110.1 创建、修改和删除Schema110.2 搜索路径 openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema Schema又称作模式。通过管理Schema&#xff0c;允许多个用户使用同一数据库而不…

为什么 ConcurrentHashMap 中 key 不允许为 null

ConcurrentHashMap 在ConcurrentHashMap 的源码&#xff0c;在 put 方法里面&#xff0c;可以看到这样一段代码&#xff0c;如果 key 或者 value 为空&#xff0c;则抛出空指针异常。 但是为什么 ConcurrentHashMap 不允许 key 或者 value 为空呢&#xff1f; 原因 简单来说&…

macOS M1安装wxPython报错‘tiff.h‘ file not found的解决方法

macOS12.6.6 M1安装wxPython失败&#xff1a; 报错如下&#xff1a; imagtiff.cpp:37:14: fatal error: tiff.h file not found解决办法&#xff1a; 下载源文件重新编译&#xff08;很快&#xff0c;5分钟全部搞定&#xff09;&#xff0c;分三步走&#xff1a; 第一步&…

Reading:Deep dive into the OnPush change detection strategy in Angular

原文连接&#xff1a;IndepthApp 今天深入阅读并总结Angualr中onPush更新策略。 1. 两种策略 & whats Lview&#xff1f; Angular 实现了两种策略来控制各个组件级别的更改检测行为。这些策略定义为Default和OnPush&#xff1a; 被定义为枚举&#xff1a; export enum…

IOC课程整理-3 Spring IoC 容器概述

1 Spring IoC依赖查找 延迟依赖查找主要用于获取 BeanFactory 后&#xff0c;不马上获取相关的 Bean&#xff0c;比如在 BeanFactoryPostProcessor 接口中获取 ConfigurableListableBeanFactory 时&#xff0c;不马上获取&#xff0c;降低 Bean 过早初始化的情况 2 Spring IoC…

redis缓存击穿,redisson分布式锁,redis逻辑过期

什么是缓存击穿&#xff1a; 缓存击穿是指在高并发环境下&#xff0c;某个热点数据的缓存过期&#xff0c;导致大量请求同时访问后端存储系统&#xff0c;引起系统性能下降和后端存储压力过大的现象。 解决方案&#xff1a; 1. redisson分布式锁 本质上是缓存重建的过程中&…

echarts的legend图例,要给图例中的不同文字设置不同颜色

可以用rich&#xff0c;先创建样式a&#xff0c;然后在formatter中用{a|文字}的形式使用&#xff0c;就能将文字使用a样式了

什么是全排列?(算法实现)

全排列是什么&#xff1f; 全排列是指将一组元素按照一定顺序进行排列的所有可能结果。以一组数字为例&#xff0c;比如[1, 2, 3]的全排列结果为&#xff1a;[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]。 全排列有许多不同的计算方法&#xff0c;其中…

mybatis-plus正确使用姿势:依赖配置、Mapper扫描、多数据源、自动填充、逻辑删除。。。

一、前言 本文基于 springboot、maven、jdk1.8、mysql 开发&#xff0c;所以开始前我们需要准备好这套环境。 1.1 依赖准备 想要什么依赖版本的去 maven 仓库查看&#xff1a;https://mvnrepository.com/ 引入 mybatis-plus 依赖&#xff1a; <dependency><group…

【Linux】冯诺依曼体系结构以及初始操作系统

文章目录 冯诺依曼体系结构操作系统概念设计OS的目的定位如何理解管理 总结系统调用和库函数概念 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识…

黑豹程序员-架构师学习路线图-百科:jMeter并发测试计划

我们开发一个软件系统&#xff0c;为了保证代码的正确&#xff0c;我们需要测试。测试日常包括&#xff1a;单元测试、功能测试、集成测试、压力测试、回归测试。 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。 JMeter 最初被…

JAVA反射机制及动态代理

反射机制 反射机制是什么 1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得到class对象之后&#xff0c; 再通过class对象进行反编译&#xff0c;从而获取对象的各种信息。 2、Java属于先编译再运行的…

Flutter 使用 GetX 中遇到的问题

创建了控制器&#xff0c;但是在别的页面中&#xff0c;无法引用控制器里面的某些变量 如下图&#xff1a;后来发现&#xff0c;是命名的问题&#xff0c; 如果是以 _ 下划线开头的变量&#xff0c;那么就无法被引用

(三)docker:Dockerfile构建容器运行jar包

目录结构以及准备的文件 ├── dockerfile │ ├── Dockerfile │ ├── application.properties │ ├── demo.jar │ └── jdk-17.0.9-linux-x64.tar.gz2.Dockerfile内容 FROM ubuntu:latest # JDK存放处 ENV JAVA_DIR/home # 拷贝本地jdk到容器home目录下…

京东数据分析:2023年9月京东洗地机行业品牌销售排行榜

鲸参谋监测的京东平台9月份洗地机市场销售数据已出炉&#xff01; 9月份&#xff0c;洗地机市场的销售额增长。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;9月京东平台上洗地机的销量为9.2万&#xff0c;销售额将近2.2亿&#xff0c;同比增长约9%。从价格上看&#…

如何使用htmltab库

htmltab是一个用于从HTML表格中提取数据的Python库。它可以将HTML表格转换为Pandas数据框&#xff0c;方便进行数据处理和分析。 要使用htmltab库&#xff0c;首先需要安装htmltab。可以使用pip命令来安装htmltab&#xff0c;命令如下&#xff1a; pip install htmltab 安装完…

[SHCTF 2023 校外赛道] pwn

有19道题这么多,不过基本是入门题,都是在骗新生,看这么容易快来PWN吧! week1 四则计算器 这里用危险函数gets读入有个溢出.而且PIE也没开,地址是固定的.而且有后门.直接溢出到ret写上后门即可. from pwn import *p remote(112.6.51.212, 31473) context(archamd64, log_lev…

【手机端远程连接服务器】安装和配置cpolar+JuiceSSH:实现手机端远程连接服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …