qt 布局学习笔记

目录

qt下载地址:

widget 宽高

管理信息列表源码

c++版:

pro文件:

qt 设置水平布局,里面有两个按钮,每个按钮就变的很宽,怎么设置按钮的精确位置

设置固定大小:

使用弹性空间(Spacer)

使用布局比例:

qt c++ 加载ui文件:

方法1: 使用Qt Designer UI文件直接加载

方法2: 将UI文件转换为C++代码


qt下载地址:

Download Qt: Install and get started

widget 宽高

管理信息列表源码

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QLabel, QWidget, QVBoxLayout, QHBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QSizeclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Student Information List")self.setGeometry(100, 100, 450, 400)self.listWidget = QListWidget(self)self.setCentralWidget(self.listWidget)# 示例数据students = [{"name": "John Doe", "id": "123456789", "gender": "Male", "age": "20", "height": "180cm", "avatar": "res/drawable/head.png"},{"name": "Jane Smith", "id": "987654321", "gender": "Female", "age": "22", "height": "170cm", "avatar": "res/drawable/head.png"},{"name": "aaaa", "id": "fsadf", "gender": "sfd", "age": "sdf", "height": "170cm", "avatar": "res/drawable/head.png"},# 添加更多学生数据]for student in students:self.add_student(student)def add_student(self, student):# 创建一个自定义的QWidgetwidget = QWidget()hbox = QHBoxLayout()hbox.setContentsMargins(10, 0, 10, 0)hbox.setSpacing(5);# 头像label_avatar = QLabel()pixmap = QPixmap(student["avatar"]).scaled(75, 82)  # 假设头像图片的路径正确label_avatar.setPixmap(pixmap)label_avatar.setFixedSize(80, 90)hbox.addWidget(label_avatar)# 其他信息info_widget = QWidget()vbox = QVBoxLayout()# 第一行信息:名字和身份证号label_name_id = QLabel(f"姓名:{student['name']} 性别:{student['gender']}, {student['id']}")label_name_id.setFixedSize(300, 20)vbox.addWidget(label_name_id)# 第二行信息:性别,年龄,身高label_details = QLabel(f"类型:{student['age']}  单位:{student['age']} years old, {student['height']}")label_details.setFixedSize(300, 20)vbox.addWidget(label_details)# 第二行信息:性别,年龄,身高label_details = QLabel(f"职务:{student['age']}  证件号:{student['age']} years old, {student['height']}")label_details.setFixedSize(300, 20)vbox.addWidget(label_details)vbox.setContentsMargins(10, 10, 10, 10)vbox.setSpacing(5);info_widget.setLayout(vbox)hbox.addWidget(info_widget)widget.setLayout(hbox)# 将自定义widget加入到QListWidgetItem中item = QListWidgetItem()item.setSizeHint(widget.sizeHint())  # 必须设置sizeHintself.listWidget.addItem(item)self.listWidget.setItemWidget(item, widget)if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

c++版:

main.cpp

#include <QApplication>
#include <QMainWindow>
#include <QListWidget>
#include <QListWidgetItem>
#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QPixmap>// 示例数据
struct Student {QString name;QString id;QString gender;QString age;QString height;QString avatar;
};class MainWindow : public QMainWindow {
public:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {setWindowTitle("Student Information List");setGeometry(100, 100, 450, 400);auto listWidget = new QListWidget(this);setCentralWidget(listWidget);QVector<Student> students = {{"John Doe", "123456789", "Male", "20", "180cm", "111.jpg"},{"Jane Smith", "987654321", "Female", "22", "170cm", "111.jpg"},{"aaaa", "fsadf", "sfd", "sdf", "170cm", "111.jpg"}// 添加更多学生数据};for (auto &student : students) {addStudent(student, listWidget);}}void addStudent(const Student &student, QListWidget *listWidget) {auto widget = new QWidget();auto hbox = new QHBoxLayout(widget);hbox->setContentsMargins(10, 0, 10, 0);hbox->setSpacing(5);// 头像auto labelAvatar = new QLabel();QPixmap pixmap(student.avatar);labelAvatar->setPixmap(pixmap.scaled(75, 82));labelAvatar->setFixedSize(80, 90);hbox->addWidget(labelAvatar);// 其他信息auto infoWidget = new QWidget();auto vbox = new QVBoxLayout(infoWidget);// 第一行信息:名字和身份证号auto labelNameId = new QLabel(QString("姓名:%1 性别:%2, %3").arg(student.name, student.gender, student.id));labelNameId->setFixedSize(300, 20);vbox->addWidget(labelNameId);// 第二行信息:年龄,身高auto labelDetails = new QLabel(QString("年龄:%1 years old, 身高:%2").arg(student.age, student.height));labelDetails->setFixedSize(300, 20);vbox->addWidget(labelDetails);vbox->setContentsMargins(10, 10, 10, 10);vbox->setSpacing(5);hbox->addWidget(infoWidget);auto item = new QListWidgetItem();item->setSizeHint(widget->sizeHint());listWidget->addItem(item);listWidget->setItemWidget(item, widget);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.show();return app.exec();
}

pro文件:

QT       += core gui
QT += core gui widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

qt 设置水平布局,里面有两个按钮,每个按钮就变的很宽,怎么设置按钮的精确位置

  • 设置固定大小

  • 可以为按钮设置固定的宽度和高度,这样按钮就不会根据布局自动调整大小了。

QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");button1->setFixedSize(100, 30); // 设置按钮的固定大小
button2->setFixedSize(100, 30);QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
  • 使用弹性空间(Spacer)

  • : 你可以在按钮之间或按钮周围添加空间,这样可以更精确地控制按钮的位置。

QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");QHBoxLayout *layout = new QHBoxLayout;
layout->addStretch(1); // 在布局开始处添加弹性空间
layout->addWidget(button1);
layout->addStretch(1); // 在两个按钮之间添加弹性空间
layout->addWidget(button2);
layout->addStretch(1); // 在布局结束处添加弹性空间
  • 使用布局比例

  • 使用 QSizePolicy 来设置控件的大小策略,允许更细致的控制。

QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");button1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
button2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1, 1);
layout->addWidget(button2, 1);

qt c++ 加载ui文件:

方法1: 使用Qt Designer UI文件直接加载

在这种方法中,你可以使用QUiLoader类来动态加载UI文件。这种方式的优点是你可以在不重新编译程序的情况下更改UI设计,但缺点是可能会增加程序的启动时间和复杂性。

  1. 包括必要的头文件

    #include <QUiLoader> 
    #include <QFile> 
    #include <QWidget>
    
  2. 加载.ui文件: 你可以创建一个函数来加载UI文件,并返回一个指向加载的界面的指针。

    QWidget* loadUiFile(QWidget* parent)
    {QFile file(":/path/to/your.ui");file.open(QFile::ReadOnly);QUiLoader loader;QWidget* formWidget = loader.load(&file, parent);file.close();return formWidget;
    }
    

  3. 在主窗口中使用加载的UI

#include <QApplication>
#include <QVBoxLayout>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QWidget* myForm = loadUiFile(&window);QVBoxLayout* layout = new QVBoxLayout;layout->addWidget(myForm);window.setLayout(layout);window.show();return app.exec();
}

方法2: 将UI文件转换为C++代码

Qt提供了一个名为uic的工具,它可以将UI文件转换为C++类。这种方法的优点是执行效率更高,因为UI直接编译到程序中,但缺点是每次UI改变都需要重新编译。

  1. 在.pro文件中添加UI文件: 将UI文件添加到Qt项目文件中以自动调用uic工具。

    FORMS += mainwindow.ui
    
  2. 使用转换后的类uic工具会生成一个头文件,通常命名为ui_<filename>.h,你可以在你的C++类中包含这个文件,并使用其中的类。

#include "ui_mainwindow.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr){ui.setupUi(this);}private:Ui::MainWindow ui;
};
  1. 在主函数中创建和显示窗口

int main(int argc, char *argv[])
{QApplication app(argc, argv);MainWindow mainWindow;mainWindow.show();return app.exec();
}

这两种方法可以根据不同的开发需求选择使用。如果需要灵活性和频繁的UI更改,推荐使用方法1;如果追求性能和稳定性,推荐使用方法2。

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

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

相关文章

高效掌控速卖通自养号测评:成本、步骤、技巧全方位掌握

在跨境电商的汹涌浪潮中&#xff0c;速卖通犹如一颗璀璨的领航星&#xff0c;引领着无数寻求海外拓展的企业和商家驶向国际市场的广阔海域。从最初的C2C模式起步&#xff0c;速卖通历经蜕变&#xff0c;如今已华丽转身成为B2C跨境电商领域的翘楚&#xff0c;承载着无数中国卖家…

【传知代码】基于图神经网络的知识追踪方法(论文复现)

前言&#xff1a;本文将深入探讨基于图神经网络的知识追踪方法&#xff0c;旨在通过构建知识图谱来捕捉知识之间的复杂关联&#xff0c;并利用图神经网络强大的表示学习能力来建模学生的学习过程。我们将首先介绍图神经网络的基本原理和关键技术&#xff0c;然后详细阐述如何将…

现代前端工程化实践:Git、Husky、Commitlint与PNPM的协同作战

引言 Git Husky 与 Commitlint 是两个在 Git 工作流程中非常实用的工具&#xff0c;它们可以帮助团队维护代码质量和提交规范。Husky 是一个 Git 钩子管理器&#xff0c;允许你在仓库级别方便地配置钩子脚本&#xff1b;而 Commitlint 则是用来规范 Git 提交信息的工具&#x…

edge浏览器的网页复制

一些网页往往禁止复制粘贴&#xff0c;本文方法如下&#xff1a; 网址最前面加上 read: &#xff08;此方法适用于Microsoft Edge 浏览器&#xff09;在此网站网址前加上read:进入阅读器模式即可

跨境电商投放Facebook广告推广攻略!

在出海浪潮中&#xff0c;跨境电商已经成为企业连接不同市场、拓展国际业务的重要途径。Facebook&#xff0c;作为全球最大的社交平台之一&#xff0c;拥有超过20亿的活跃用户&#xff0c;为跨境卖家提供了一个无与伦比的营销舞台。有效利用Facebook广告&#xff0c;不仅能帮助…

MySQL导入SQL脚本---超详细介绍

1.新建xxx数据库&#xff0c;字符集选对。 2.在mysql安装目录下cmd进入小黑窗 3.执行mysql -uroot -p123456 --default-character-setutf8命令 4.use xxx; 5.source xxx.sql 执行完上面的命令等待结束就可以了 需要注意的是--default-character-setutf8&#xff0c;要不然可…

如何选择一款开放式耳机?六大独家选购技巧超详细汇总!

​喜欢户外活动的朋友们&#xff0c;你们都是懂得享受生活的达人吧&#xff01;想象一下&#xff0c;在户外活动时&#xff0c;如果能有一副既适合场景又提供超棒音乐体验的耳机&#xff0c;那该多完美啊&#xff01;这时候&#xff0c;开放式耳机就闪亮登场了&#xff01;它的…

RocketMQ实战教程之常见概念和模型

RocketMQ实战教程之常见概念和模型 常见概念与模型 官方文档: https://rocketmq.apache.org/zh/docs/introduction/02concepts 1 常见概念[重点] 消息&#xff08;Message) 消息是 Apache RocketMQ 中的最小数据传输单元。生产者将业务数据的负载和拓展属性包装成消息发送…

JavaWeb-JS

目录 学习重点 什么是 JavaScript? Web标准 JS的引入方式 JS的基本语法 JS的函数 JS的对象 JS事件监听 学习重点 js 引入方式 js 基础语法 js 函数 js 对象 js 事件监听 什么是 JavaScript? Web标准 Web 标准也称为网页标准 &#xff0c;由一系列的标准组成&#xff0…

七年之痒!一个 PHP 程序员职业生涯的自述

大家好&#xff0c;我是码农先森。 今年刚好是我毕业的第七个年头&#xff0c;在婚姻感情当中都有一种「七年之痒」的说法&#xff0c;这次我把这个词「七年之痒」用一次在我的职业生涯复盘上。七年前我从告别校园&#xff0c;踏入互联网编程行业&#xff0c;七年后我依旧在编…

FFmpeg之转码

文章目录 概述transcode小结 概述 上一篇说了主要的流程&#xff0c;也就是ffmpeg_parse_options的流程&#xff0c;如下图&#xff1a; 红色箭头的流程说的差不多了&#xff0c;接下来看看绿色框框&#xff0c;也就是transcode的流程。 transcode 还是先给出我画的流程图&…

如何利用InputStream类实现文件读取与处理?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

K8S中Prometheus+Grafana监控

1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理&#xff1a;通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用&#xff0c;比如haproxy,nginx&#xff0c;Mysql,Linux系统信…

C++质数的那些事(判断指数、区间筛质数、互质等等)

质数的定义&#xff1a;若一个正整数除了1和它自身之外不能被任何自然数整除&#xff0c;则该数称为质数&#xff0c;也叫素数。否则为合数。 质数的性质&#xff1a;质数的分布较为稀疏&#xff0c;对于一个足够大的数S&#xff0c;不超过S的质数大约有个&#xff0c;也就是说…

有趣的css - 水波纹按钮

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是一个好看有质感的水波纹按钮。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整体效果 &a…

【Spring Cloud】远程调用

目录 Spring Cloud Netflix Feign简介前言Feign是什么OpenFeign组件和Spring Cloud OpenFeignOpenFeign组件Spring Cloud OpenFeign OpenFeign-微服务接口调用需求说明1. 启动Eureka Server服务2.创建两个项目&#xff0c;将其注册到Eureka Server3.在服务提供者中添加业务处理…

【UE Websocket】“WebSocket Server”插件使用记录

1. 在商城中下载“WebSocket Server”插件 该插件具有如下节点&#xff0c;基本可以满足WebSocket服务端的所有需求 2. 如果想创建一个基本的服务端&#xff0c;我们可以新建一个actor蓝图&#xff0c;添加如下节点 3. UE运行后&#xff0c;我们可以使用在线的websocket测试助手…

RuntimeError: CUDA out of memory. Tried to allocate 1.77 GiB?如何解决

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

开源与闭源AI模型的对决:数据隐私、商业应用与社区参与

引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;模型的发展路径主要分为“开源”和“闭源”两条。这两种模型在数据隐私保护、商业应用以及社区参与与合作方面各有优劣&#xff0c;是创业公司、技术巨头和开发者们必须仔细权衡的重要选择。那么&#xff0c;面对这些…