Qt 布局(QLayout 类QStackedWidget 类) 总结

news2025/4/9 4:10:48

一、QLayout类(基本布局)

QLayout类是Qt框架中用于管理和排列QWidget控件的布局类。它提供了一种方便而灵活的方式来自动布局QWidget控件。QLayout类允许您以一种简单的方式指定如何安排控件,并能够自动处理控件的位置和大小,以使其适应更改的父窗口的大小。

QLayout类有多种布局类型可供选择,包括水平布局(QHBoxLayout)、垂直布局(QVBoxLayout)、网格布局(QGridLayout)、堆叠布局(QStackedLayout)和表单布局(QFormLayout)等。每种布局类型都有其特定的用途和优势。

使用QLayout类来布局控件可以减少手动计算和调整控件位置和大小的麻烦,同时也可以确保应用程序的可移植性和可伸缩性,让您的应用程序更加灵活和易于维护。

案例分析:

实现显示员工信息

代码示例:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QGridLayout>
#include <QPushButton>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    // 1:左边 网格布局、表格布局
    QGridLayout *lLayout;

    QLabel *UserNumber;
    QLineEdit *UserNumberLineEdit;

    QLabel *UserName;
    QLineEdit *UserNameLineEdit;

    QLabel *UserSex;
    QComboBox *UserSexCombobox;

    QLabel *UserDepart;
    QTextEdit *UserDepartTextEdit;

    QLabel *UserAge;
    QLineEdit *UserAgeLineEdit;

    // 2:右边 水平布局
    QHBoxLayout *toprightlayout;
    QVBoxLayout *rightlayout;

    QLabel *MyselfInfo;
    QTextEdit *MyselfInfoTextEdit;

    // 3:右边底部
    QPushButton *okbutton,*cancelbutton;
    QHBoxLayout *buttomLayout;
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("员工信息");

    // 左边控件
    UserNumber=new QLabel("员工编号:");
    UserNumberLineEdit=new QLineEdit;

    UserName=new QLabel("员工姓名:");
    UserNameLineEdit=new QLineEdit;

    UserSex=new QLabel("员工性别:");
    UserSexCombobox=new QComboBox;
    UserSexCombobox->addItem("男");
    UserSexCombobox->addItem("女");

    UserDepart=new QLabel("所在部门:");
    UserDepartTextEdit=new QTextEdit;

    UserAge=new QLabel("员工年龄:");
    UserAgeLineEdit=new QLineEdit;

    // 网格布局
    lLayout=new QGridLayout();

    lLayout->addWidget(UserNumber,0,0); // // 员工编号
    lLayout->addWidget(UserNumberLineEdit,0,1);

    lLayout->addWidget(UserName,1,0);
    lLayout->addWidget(UserNameLineEdit,1,1);

    lLayout->addWidget(UserSex,2,0);
    lLayout->addWidget(UserSexCombobox,2,1);

    lLayout->addWidget(UserDepart,3,0);
    lLayout->addWidget(UserDepartTextEdit,3,1);

    lLayout->addWidget(UserAge,4,0);
    lLayout->addWidget(UserAgeLineEdit,4,1);

    lLayout->setColumnStretch(0,1);
    lLayout->setColumnStretch(1,3);

    // 右边上部分
    toprightlayout=new QHBoxLayout();
    toprightlayout->setSpacing(25);

    MyselfInfo=new QLabel("个人简历:");
    MyselfInfoTextEdit=new QTextEdit;

    rightlayout=new QVBoxLayout();
    rightlayout->addLayout(toprightlayout);
    rightlayout->addWidget(MyselfInfo);
    rightlayout->addWidget(MyselfInfoTextEdit);

    // 右边下部分
    okbutton=new QPushButton("确认");
    cancelbutton=new QPushButton("退出");

    buttomLayout=new QHBoxLayout();
    buttomLayout->addStretch();
    buttomLayout->addWidget(okbutton);
    buttomLayout->addWidget(cancelbutton);

    //
    QGridLayout *mlayout=new QGridLayout(this);
    mlayout->setMargin(20);
    mlayout->setSpacing(10);
    mlayout->addLayout(lLayout,0,0); // 左边
    mlayout->addLayout(rightlayout,0,1); // 右上
    mlayout->addLayout(buttomLayout,1,0,1,2);

    mlayout->setSizeConstraint(QLayout::SetFixedSize);

}

Dialog::~Dialog()
{
}

main.cpp

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

二、QStackedWidget 类 (堆栈窗体)

QStackedWidget类是一个堆栈窗口部件,它可以包含多个子部件(页面),但是一次只能显示其中一个页面。通过在这些页面上的导航动作,用户可以在页面之间移动。

QStackedWidget是一个非常有用的类,可以为用户提供一种非常方便的方式来组织和访问应用程序的不同部分。它可以用于构建单页应用程序或多页应用程序,也可以用于构建向导式应用程序。

QStackedWidget继承自QWidget类,它具有以下方法和属性:

  • addWidget():向QStackedWidget中添加子部件。
  • currentIndex():返回当前显示的子部件的索引号。
  • setCurrentIndex():设置要显示的子部件的索引号。
  • widget():返回指定索引号的子部件。

QStackedWidget类还有一些信号,例如currentChanged(),在当前子部件改变时发出。这些信号可以连接到槽函数中,以执行特定的操作。

总之,QStackedWidget类提供了一种方便的方式来实现多页应用程序,用户可以在不同的页面之间进行导航,以方便地访问应用程序中的不同部分。

案例分析:

实现功能如下

代码示例:

stackeddlg.h

#ifndef STACKEDDLG_H
#define STACKEDDLG_H

#include <QDialog>

#include <QListWidget>
#include <QStackedWidget>
#include <QLabel>


class stackedDlg : public QDialog
{
    Q_OBJECT

public:
    stackedDlg(QWidget *parent = nullptr);
    ~stackedDlg();

public:
    QStackedWidget *statcks;
    QListWidget *qlist; // 列表框控件创建

    QLabel *lab1,*lab2,*lab3,*lab4,*lab5;

};
#endif // STACKEDDLG_H

main.cpp

#include "stackeddlg.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    stackedDlg w;
    w.show();
    return a.exec();
}

stackeddlg.cpp

#include "stackeddlg.h"

#include <QHBoxLayout>

stackedDlg::stackedDlg(QWidget *parent)
    : QDialog(parent)
{

    setWindowTitle("堆栈窗体测试");

    qlist=new QListWidget(this);
    qlist->insertItem(0,"Linux1");
    qlist->insertItem(1,"Linux2");
    qlist->insertItem(2,"Linux3");
    qlist->insertItem(3,"Linux4");
    qlist->insertItem(4,"Linux5");

    lab1=new QLabel("Linux1 Qt");
    lab2=new QLabel("Linux2 Qt");
    lab3=new QLabel("Linux3 Qt");
    lab4=new QLabel("Linux4 Qt");
    lab5=new QLabel("Linux5 Qt");

    statcks=new QStackedWidget(this);
    statcks->addWidget(lab1);
    statcks->addWidget(lab2);
    statcks->addWidget(lab3);
    statcks->addWidget(lab4);
    statcks->addWidget(lab5);

    QHBoxLayout *mlayout=new QHBoxLayout(this);

    mlayout->setMargin(10);
    mlayout->setSpacing(20);

    mlayout->addWidget(qlist);
    mlayout->addWidget(statcks,0,Qt::AlignCenter);
    mlayout->setStretchFactor(qlist,1);
    mlayout->setStretchFactor(statcks,5);
}

stackedDlg::~stackedDlg()
{
}

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

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

相关文章

【HCIA】静态路由综合实验

实验要求&#xff1a; 1、R6为ISP&#xff0c;接口IP地址均为公有地址&#xff0c;该设备只能配置IP地址之后不能再对其进行任何配置 2、R1-R5为局域网&#xff0c;私有IP地址192.168.1.0/24&#xff0c;请合理分配 3、R1、R2、R4&#xff0c;各有两个环回IP地址;R5,R6各有一…

基于 Kubernetes 的 Serverless PaaS 稳定性建设万字总结

作者&#xff1a;许成铭&#xff08;竞霄&#xff09; 数字经济的今天&#xff0c;云计算俨然已经作为基础设施融入到人们的日常生活中&#xff0c;稳定性作为云产品的基本要求&#xff0c;研发人员的技术底线&#xff0c;其不仅仅是文档里承诺的几个九的 SLA 数字&#xff0c…

MyBatis的缓存,一级缓存,二级缓存

10、MyBatis的缓存 10.1、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession对象 查询的结果数据会被缓存&#xff0c;下次执行相同的查询语句&#xff0c;就 会从缓存中&#xff08;缓存在内存里&#xff09;直接获取&#xff0c;不会重新访问…

c++string类的赋值问题

来看问题&#xff1a; 为什么呢&#xff1f;是因为定义string a""时候a没有占用空间&#xff0c;所以没有a[0],a[1],a[3]。如果说string a"hhhhhh"&#xff0c;那么图中a[0],a[1],a[3]就有效了。正确的做法是用连接&#xff0c;或者是定义时写成string a(6…

爬虫 | 正则、Xpath、BeautifulSoup示例学习

文章目录 &#x1f4da;import requests&#x1f4da;import re&#x1f4da;from lxml import etree&#x1f4da;from bs4 import BeautifulSoup&#x1f4da;小结 契机是课程项目需要爬取一份数据&#xff0c;于是在CSDN搜了搜相关的教程。在博主【朦胧的雨梦】主页学到很多…

vsc连接wsl安装vsc时遇到权限问题的解决方案

当点击左下角的连接 遇到下面的权限提示时 mkdir: cannot create directory ‘/home/xxx(用户名)/.vscode-server’: Permission denied 可以新建文件 /etc/wsl.conf&#xff0c;并拷贝如下内容 # Automatically mount Windows drive when the distribution is launched [aut…

面试总结之Java基础

1、反射 1.1、概述 反射&#xff1a;加载类&#xff08;通过反射将类的字节码文件加载到内存中&#xff09;&#xff0c;并允许以编程的方式解剖类中的各种成分&#xff08;成员变量、方法、构造器等&#xff09;反射需要掌握的内容&#xff1a; 1&#xff09;记载类&#xf…

实习项目遇到的bug

问题1&#xff1a; 大概是因为没设置ts类型&#xff0c;它查不到的问题&#xff0c;不定义的话加上问号&#xff0c;加上可选链就不会报错了 {{bizEquipmentInfo.lastUnlockingVO?.lastUnlockingTime.replace(T, )? bizEquipmentInfo.lastUnlockingVO?.lastUnlockingTime.r…

通讯网关软件024——利用CommGate X2Access实现Modbus TCP数据转储Access

本文介绍利用CommGate X2ACCESS实现从Modbus TCP设备读取数据并转储至ACCESS数据库。CommGate X2ACCESS是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从Modbus TCP设备读取数据并转储…

【EventLoop】问题一次搞定

&#x1f4cd; JS的事件循环机制恐怕是大多数前端开发者头顶上的一座大山之一&#xff0c;最近通过拜读两篇文档&#xff0c;对eventloop进行了深刻的理解&#xff1b;通过这篇文档对要点进行总结&#xff1b; article1&#xff1a; 波神的这篇eventLoop文章适合反复重温&…

Ubuntu22安装Docker engine(apt安装方式)

一、准备工作 新创建一个虚拟机。 进入虚拟机&#xff1a; 二、安装docker docker现在对用不同主机提供了不同安装包&#xff1a;docker engine 和 docker desktop。 docker desktop适用于图形化的桌面电脑&#xff0c;docker engine适用于服务器。我们这里当然是安装docker…

Mac 远程 Ubuntu

1. Iterm2 添加ssh 参考&#xff1a;https://www.javatang.com/archives/2021/11/29/13063392.html 2. Finder 添加远程文件管理 2.1 ubuntu 配置 安装samba sudo apt-get install samba配置 [share]path /home/USER_NAME/shared_directoryavailable yesbrowseable ye…

快速计算发票金额

快速计算发票总额 背景 在日常的工作中&#xff0c;我们不免需要面临费用报销问题&#xff0c;在进行费用报销时&#xff0c;我们需要提供费用相关的发票&#xff0c;并需要在报销单上填写相关的金额数据。这时我们将面临核对和计算发票金额的需求。 核对发票 如今&#xf…

基于和声优化的BP神经网络(分类应用) - 附代码

基于和声优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于和声优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.和声优化BP神经网络3.1 BP神经网络参数设置3.2 和声算法应用 4.测试结果&#xff1a;5.M…

STM32成熟变频逆变器方案

该方案是一款成熟的变频逆变器的方案&#xff0c;主要是把电源从直流到3相交流的转换&#xff0c;包含变频控制板&#xff0c;逆变主板&#xff0c;IO板&#xff0c;变频控制板主控是STM32F103VET6&#xff0c;配套软件。每一块板子都是原理图和PCB一一对应&#xff0c;并且配套…

函数调用:为什么会发生stack overflow?

在开发软件的过程中我们经常会遇到错误&#xff0c;如果你用 Google 搜过出错信息&#xff0c;那你多少应该都访问过Stack Overflow这个网站。作为全球最大的程序员问答网站&#xff0c;Stack Overflow 的名字来自于一个常见的报错&#xff0c;就是栈溢出&#xff08;stack ove…

Python中图像相似性度量方法汇总

1. 引言 在当前到处充满着图像的世界里&#xff0c;测量和量化图像之间的相似性已经成为一项关键的任务。无论是图像检索、内容推荐还是视觉搜索&#xff0c;图像相似性方法在现代计算机视觉的应用中都发挥着关键的作用。 幸运的是&#xff0c;Python提供了大量的工具和库&am…

Zabbix监控系统系列之二十二:ESXi虚拟化监控

背景概述 此前写了一篇VMware虚拟化监控的文章&#xff0c;但它主要是针对vCenter Server而不是ESXi。 Zabbix监控系统系列之七&#xff1a;VMware虚拟化监控 本次自己家中组建HomeLab实验环境&#xff0c;因此我将对于ESXi单机环境的监控方式进行记录。 操作步骤 创建ESXi普…

独立式三相无源逆变电源设计

摘要 面对全球日趋严重的能源危机问题&#xff0c;可再生能源的开发和利用得到了人们的高度重视。其中辐射到地球太阳能资源是十分富饶的&#xff0c;绿色清洁的太阳能不会危害我们的生存环境&#xff0c;因而受到了人们的广泛利用。光伏发电作为可再生能源被广泛的应用&#x…

阿里云在云原生领域喜获多项 OSCAR 开源尖峰案例奖

当前&#xff0c;国内开源技术正逐渐在各领域落地&#xff0c;越来越多的企业已经或准备使用开源&#xff0c;优秀的开源案例可以起到领航和参考作用。为了更好地推动开源技术在中国市场的落地&#xff0c;鼓励企业和厂商使用开源&#xff0c;鼓励企业或个人进一步探索我国开源…