【Qt】跨平台UI布局,以Windows + Android安卓为例

news2024/11/20 6:19:22

文章目录

  • 使用Qt Designer
    • 直接拖放Label
    • 结合Horizontal Layout + Horizontal Spacer
  • 使用纯代码
    • 如何改用纯代码方式布局
    • 为不同平台设置不同文字

Qt适合跨平台开发,但跨平台时如何实现UI布局这种基础只是都鲜有人提及。当然也有可能是太基础,大家觉得没有提及的必要。

但总有学习Qt的新人被这一步难住,笔者愿意来介绍一下Qt平台下,如何同时为多平台布局UI,这里以同时兼容Windows应用和Android应用为例。

我们想要达到的效果很基础也很简单,就是在屏幕中央显示一行文字

  • 在Windows中显示Hello Windows
  • 在安卓中显示Hello Android

其中在Windows中,不管窗口大小如何变化, 文字始终保持在窗口中央

笔者分别用Qt Designer和纯代码实现一次

使用Qt Designer

使用Designer虽然直观,通过拖拽和配置就可以完成布局。但Designer也有一些明显的缺点,比如配置麻烦、相关文档少、不适合多人协作开发等,所以在比较大的开发团队中,少见使用Designer开发的。

想要深入学习Qt开发的朋友,还是要学会使用纯代码完成布局。

这里我们在介绍如何实现上述效果的同时,也为大家展示一下Designer配置麻烦的地方

直接拖放Label

打开mainwindow.ui,直接从左边拖一个Label到窗口中:

在这里插入图片描述

在Windows中,初始可以保持在中央(毕竟我们放在了中央),但如果改变窗口大小会发现文字是保持不动的。
在安卓中只能看到一点文字

效果如下图:
在这里插入图片描述

在这里插入图片描述

结合Horizontal Layout + Horizontal Spacer

我们结合Horizontal Layout,先拖入一个Horizontal Layout,再在Layout中增加Label,为了保持Label在屏幕中间,在Label两边各放一个Horizontal Spacer:
在这里插入图片描述
在Windows中,初始还是可以保持在屏幕中央,但调整窗口大小时,文字还是保持不动。
在Android中更是直接看不到文字了。

效果如下图:
请添加图片描述

在这里插入图片描述

在这里插入图片描述
那么这一步的作用是什么呢?

和直接拖入Label的效果虽然一样,但造成结果的原因不同。前者直接是固定了文字的位置,但后者是因为Horizontal Layout的宽度没有随着窗口大小改变造成的。

为了让Layout能够随着窗口改变大小,在Layout父Widget中点击鼠标右键,选择“布局”->“栅栏布局”

在这里插入图片描述
在这里插入图片描述
再次运行可以发现,此时不管是在Windows,还是在Android平台,文字可以保持在屏幕中央了。

在Windows平台,改变窗口大小,文字也会随之调整位置,始终保持在屏幕中央。
在这里插入图片描述

请添加图片描述

使用纯代码

利用纯代码实现就相对简单了。

如何改用纯代码方式布局

  1. 删除mainwindow.ui
    在这里插入图片描述

  2. 编辑mainwindow.hmainwindow.cpp,删除其中ui相关
    在这里插入图片描述
    在这里插入图片描述

  3. 用代码添加UI布局

    #include "mainwindow.h"
    #include <QHBoxLayout>
    #include <QLabel>
    
    MainWindow::MainWindow(QWidget *parent)
    	: QMainWindow(parent)
    {
     	QWidget *container = new QWidget(); // 创建容器widget
    	this->setCentralWidget(container); // 将容器widget设置为mainwindow的central widget
    
    	QHBoxLayout *layout = new QHBoxLayout(container); //为容器wiget添加Horizontal Layout
    	QLabel *l = new QLabel("Hello World"); // 新建Label
    	layout->addStretch(); // 在Label左边添加Spacer
    	layout->addWidget(l); //将Label加入Layout中
    	layout->addStretch(); // 在Label右边添加Spacer
    }
    
    MainWindow::~MainWindow()
    {
    }
    

    也可以为container增加一些样式,比如将背景颜色设置为红色:container->setStyleSheet("background-color:red;");

效果如下:

请添加图片描述
在这里插入图片描述

为不同平台设置不同文字

Qt中有宏可以判断平台:

  • Q_OS_WIN:Windows
  • Q_OS_MACOS:macOS
  • Q_OS_LINUX:Linux
  • Q_OS_UNIX:UNIX(包括 Linux、macOS、FreeBSD、OpenBSD 等)
  • Q_OS_ANDROID:Android
  • Q_OS_IOS:iOS
  • Q_OS_WASM:WebAssembly
  • Q_OS_DARWIN:Darwin (包括 macOS 和 iOS)

对我们的想要达到的目的,在创建Label时判断平台,创建不同内容的Label:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QWidget *container = new QWidget();
    container->setStyleSheet("background-color:red;");
    this->setCentralWidget(container);

    QHBoxLayout *layout = new QHBoxLayout(container);
#if defined(Q_OS_WIN)
    QLabel *l = new QLabel("Hello Windows");
#elif defined(Q_OS_ANDROID)
    QLabel *l = new QLabel("Hello Android");
#endif
    layout->addStretch();
    layout->addWidget(l);
    layout->addStretch();
}

在这里插入图片描述

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

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

相关文章

移动Web——平面转换-多重转换

1、平面转换-多重转换 多重转换技巧&#xff1a;先平移再旋转 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&qu…

【Linux】第三十八站:信号处理

文章目录 一、信号处理二、再谈进程地址空间三、内核如何实现信号的捕捉四、sigaction 一、信号处理 我们知道&#xff0c;信号保存以后&#xff0c;会在合适的时候进行处理这个信号。 那么信号是如何被处理的&#xff1f;什么时候进行处理呢&#xff1f; 当我们的进程从内核…

数据结构三:线性表之单链表(带头结点单向)的设计与实现

线性表的链式存储结构正是所谓的单链表&#xff0c;何谓单链表&#xff1f;通过地址将每一个数据元素串起来&#xff0c;进行使用&#xff0c;这可以弥补顺序表在进行任意位置的插入和删除需要进行大量的数据元素移动的缺点&#xff0c;只需要修改指针的指向即可&#xff1b;单…

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

扭蛋机小程序开发:探索用户体验与商业价值的融合

一、引言 随着移动互联网的快速发展&#xff0c;小程序作为一种新型的应用形态&#xff0c;正逐渐改变着人们的生活方式。扭蛋机小程序便是其中一例&#xff0c;它结合了线上线下的互动体验&#xff0c;为用户带来了全新的娱乐方式。本文将探讨扭蛋机小程序的开发过程&#xf…

遇到字符串拼接用它就对啦!什么你居然不知道Java中对象作为方法参数和基本数据类型作为参数的区别?有巨坑!

今天刷代码随想录&#xff0c;在使用字符串拼接时&#xff0c;发现String类确实比StringBuilder慢了不是&#xff0c;总结了StringBuilder类&#xff08;详见下面文章内容&#xff0c;点击可跳转&#xff09;&#xff0c;还有在做后两题时&#xff0c;发现了Java中集合作为参数…

二刷代码随想录|Java版|回溯算法1|回溯基础理论+组合问题

理论 写链表之类的真的很痛苦&#xff0c;赶紧跳到回溯&#xff01;这次我想结合算法设计这本书&#xff0c;把java版写出来。放在第三部分吧。希望能够在研一完成这项工作&#xff01; 从一刷总结以下的几个要点&#xff1a; 回溯方法模板性非常强&#xff01;&#xff01;可…

redis报错:WRONGTYPE Operation against a key holding the wrong kind of value

这个是在redis存取的数据时&#xff0c;存数据时的数据类型和取数据时的数据类型不一致导致的 原因分析 首先需要明白的是&#xff0c;出现这种错误的原因是因为我们在取值的时候&#xff0c;使用的命令不对&#xff0c;比如你用获取string类型的get命令去取列表list类…

前端工程化之上cdn

一、cdn介绍 cdn的使用还是和前端打包相关&#xff0c;我们都希望前端最后的打包页面越小越好。那么可不可以把一些包不pack进去&#xff0c;让用户的流浪器自行下载呢&#xff1f;答案是可以的&#xff0c;那这些包就会被托管到分发站点上&#xff0c;就是在全国都有服务器&a…

Vue3探索编辑部——关于Pinia(1)

目录 什么是Pinia&#xff1f; Vue3中的Pinia 创建项目 数据准备和引入Pinia 使用Pinia 采用action修改数据 总结 什么是Pinia&#xff1f; Pinia是Vue3的专属的状态管理工具&#xff0c;什么是状态呢&#xff1f;其实我们可以把状态理解为数据&#xff0c;或者一个业务…

(七)for循环控制

文章目录 用法while的用法for的用法两者之间的联系可以相互等价用for改写while示例for和while的死循环怎么写for循环见怪不怪表达式1省略第一.三个表达式省略&#xff08;for 改 while&#xff09;全省略即死循环&#xff08;上面已介绍&#xff09; 用法 类比学习while语句 …

Linux:命名管道及其实现原理

文章目录 命名管道指令级命名管道代码级命名管道 本篇要引入的内容是命名管道 命名管道 前面的总结中已经搞定了匿名管道&#xff0c;但是匿名管道有一个很严重的问题&#xff0c;它只允许具有血缘关系的进程进行通信&#xff0c;那如果是两个不相关的进程进行通信&#xff0…

C#,计算几何,二维贝塞尔拟合曲线(Bézier Curve)参数点的计算代码

Pierre Bzier Bzier 算法用于曲线的拟合与插值。 插值是一个或一组函数计算的数值完全经过给定的点。 拟合是一个或一组函数计算的数值尽量路过给定的点。 这里给出 二维 Bzier 曲线拟合的参数点计算代码。 区别于另外一种读音接近的贝塞耳插值算法&#xff08;Bessels int…

市场复盘总结 20240123

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票&#xff0c;只有10%的时间是可以操作&#xff0c;90%的时候都应该空仓 昨日主题投资 连板进级率 7/1…

前端实现转盘抽奖 - 使用 lucky-canvas 插件

目录 需求背景需求实现实现过程图片示意实现代码 页面效果lucky-canvas 插件官方文档 需求背景 要求实现转盘转动抽奖的功能&#xff1a; 只有正确率大于等于 80% 才可以进行抽奖&#xff1b;“谢谢参与”概率为 90%&#xff0c;“恭喜中奖”概率为 10%&#xff1b; 需求实现 实…

鸿蒙入门学习的一些总结

前言 刚开始接触鸿蒙是从2023年开始的&#xff0c;当时公司在调研鸿蒙开发板能否在实际项目中使用。我们当时使用的是OpenHarmony的&#xff0c;基于DAYU/rk3568开发板&#xff0c;最开始系统是3.2的&#xff0c;API最高是API9&#xff0c;DevecoStudio 版本3.1的。 鸿…

国考省考行测:分析推理,形式逻辑,所有有的分析

国考省考行测&#xff1a; 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和行测的重要知识点 遇到寒冬&am…

2024三掌柜赠书活动第七期:一本书读懂AIGC:探索AI商业化新时代

目录 前言AI商业化的背景和挑战关于《一本书读懂AIGC&#xff1a;探索AI商业化新时代》编辑推荐内容简介作者简介图书目录书中前言/序言《一本书读懂AIGC&#xff1a;探索AI商业化新时代》全书速览结束语 前言 不用多讲&#xff0c;想必大家也都知道&#xff0c;人工智能在过…

LLM大语言模型(五):用streamlit开发LLM应用

目录 背景准备工作切记streamlit开发LLM demo开一个新页面初始化session先渲染历史消息接收用户输入模拟调用LLM 参考 背景 Streamlit是一个开源Python库&#xff0c;可以轻松创建和共享用于机器学习和数据科学的漂亮的自定义web应用程序&#xff0c;用户可以在几分钟内构建一…

optee编译调试

编译运行 使用的是 ubuntu22.04 需要提前设置好网络 optee运行环境搭建&#xff1a;https://optee.readthedocs.io/en/latest/building/prerequisites.html 安装必要的库 sudo apt install -y \adb \acpica-tools \autoconf \automake \bc \bison \build-essential \ccach…