QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用

目录
  • main.cpp
  • mainwindow.h
  • mainwindow.cpp
  • ui界面设计
  • 登录界面为例
  • 总结

main.cpp

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QPushButton>
#include <QMainWindow>
#include <QTextCodec>//解决字符编码乱码问题
#include<QTextEdit>
#include <QSlider>//滑动杆
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public slots:
private:
    Ui::MainWindow *ui;
    QTextCodec *codec;
    QWidget *window;
    QPushButton *button1;
    QPushButton *button2;
    QPushButton *button3;
    QPushButton *button4;
    QPushButton *button5;
    QWidget *win;//方便全局使用
    QWidget *newweigdet;
};
#endif // MAINWINDOW_H

mainwindow.cpp

我就不一一举例了,具体在代码中渗透

//=============================布局管理器全精通
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QString>
#include<QStringLiteral>
#include<QDebug>//控制台输出
//==========================布局管理器
#include<QVBoxLayout>//水平
#include<QHBoxLayout>//垂直
#include<QHBoxLayout>//网格
#include<QRadioButton>
#include <QLineEdit>
#include <QCheckBox>
#include<QLabel>
#include<QPixmap>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    codec = QTextCodec::codecForName("gbk");//设置字符编码
    codec->setCodecForLocale(codec);
    setWindowTitle(codec->toUnicode("UI学习笔记"));
    win = new QWidget;//创建一个窗口部件
    newweigdet = new QWidget;
    newweigdet->hide();
    QHBoxLayout *hlay = new QHBoxLayout();//创建水平布局
    QPushButton *bt1 = new QPushButton("bt1");
    bt1->setFixedSize(100,40);//设置宽高,位置不变
    QPushButton *bt2 = new QPushButton("bt2");
    QPushButton *bt3 = new QPushButton("bt3");
    QPushButton *bt4 = new QPushButton("bt4");
    bt2->setFixedSize(100,40);//设置宽高,位置不变
    bt3->setFixedSize(100,40);//设置宽高,位置不变
//    qDebug()<<bt1->x()<<" "<<bt1->y()<<" "<<bt1->width()<<" "<<bt1->height();
//    bt1->setGeometry(0,0,800,640);
    hlay->addWidget(bt1);
    hlay->addWidget(bt2);
    hlay->addWidget(bt3);
    hlay->addWidget(bt4);
    hlay->setSpacing(30);//设置组件之间的距离
    //hlay->setContentsMargins(10,10,10,10);//设置内部控件与边框的距离
    //新建垂直布局
    QVBoxLayout *vlay = new QVBoxLayout();
    //创建3个QRadioButton
    QRadioButton *rb1 = new QRadioButton("QRadioButton 1");
    QRadioButton *rb2 = new QRadioButton("QRadioButton 2");
    QRadioButton *rb3 = new QRadioButton("QRadioButton 3");
    //将水平布局放入垂直布局
    vlay->addItem(hlay);
    vlay->addWidget(rb1);
    vlay->addWidget(rb2);
    vlay->addWidget(rb3);
    vlay->setSpacing(30);//设置组件之间的距离
    vlay->setContentsMargins(30,10,10,10);//设置内部控件与边框的距离
    /*控件大小范围限定
        通过上面的代码我们发现一个现象:程序中并没有去设置子控件的大小,
        其默认大小是Qt自动设置的,同时在窗口大小改变时,控件大小也会随之调整。
        然而有时候我们并不想要这样的效果,我们只想让控件大小保持在某一范围内,
        这时就需要用到下面几个API进行设置了。*/
    //设置按钮bt4最小宽度和最大宽度
    bt4->setMinimumWidth(60);
    bt4->setMaximumWidth(70);
    bt4->setFixedSize(50,50);//设置这个部件的宽和高【重要】
    QHBoxLayout *hlay2 = new QHBoxLayout();
    QPushButton *btOK = new QPushButton("OK");
    QPushButton *btCancel= new QPushButton("Cancel");
    hlay2->addWidget(btOK);
    //增加可伸缩空间
    hlay2->addStretch();//拉扯不影响大小【重点】
    hlay2->addWidget(btCancel);
    vlay->addItem(hlay2);
    QHBoxLayout *hlay3 = new QHBoxLayout();
    QPushButton *bt61 = new QPushButton("bt61");
    QPushButton *bt62= new QPushButton("bt62");
    QPushButton *bt63= new QPushButton("bt63");
//    bt61->setFixedSize(100,40);//设置宽高,位置不变
//    bt62->setFixedSize(100,40);//设置宽高,位置不变
//    bt63->setFixedSize(100,40);//设置宽高,位置不变
    hlay3->addWidget(bt61);
    hlay3->addWidget(bt62);
    hlay3->addWidget(bt63);
    //Qt中可以设定控件的拉伸系数,也可以理解为控件的缩放比例。
    hlay3->setStretchFactor(bt61,1);
    hlay3->setStretchFactor(bt62,2);
    hlay3->setStretchFactor(bt63,3);
    vlay->addItem(hlay3);
    win->setLayout(vlay);//水平和垂直组件放在这个QWidget
    win->show();//显示
    bt4->setFixedSize(100,50);
    bt4->setText(codec->toUnicode("下一页内容"));
    connect(bt4,&QPushButton::clicked,[&](){
       on_pushButton_clicked();
    });//设置信号与槽  上一章已经出过文章了
}
MainWindow::~MainWindow()
{
    delete ui;
}
//网格布局
void MainWindow::on_pushButton_clicked()
{
    win->hide();//隐藏上一个窗口
    // 构建控件 头像、用户名、密码输入框等
    QLabel *pImageLabel = new QLabel;
    QLineEdit *pUserLineEdit = new QLineEdit;
    QLineEdit *pPasswordLineEdit = new QLineEdit;
    QCheckBox *pRememberCheckBox = new QCheckBox;
    QCheckBox *pAutoLoginCheckBox = new QCheckBox;
    QPushButton *pLoginButton = new QPushButton;
    QPushButton *pRegisterButton = new QPushButton;
    QPushButton *pForgotButton = new QPushButton;
    QPushButton *page_up = new QPushButton;
    pLoginButton->setFixedHeight(30);//设置宽
    pUserLineEdit->setFixedWidth(200);//设置宽
    // 设置头像
    QPixmap pixmap("C:/Users/SuJieYin/Pictures/Saved Pictures/2.png");
    pImageLabel->setFixedSize(90, 90);
    pImageLabel->setPixmap(pixmap);
    pImageLabel->setScaledContents(true);//图片适应标签
    // 设置文本
    pUserLineEdit->setPlaceholderText(codec->toUnicode("QQ号码/手机/邮箱"));//显示中文
    pPasswordLineEdit->setPlaceholderText(codec->toUnicode("密码"));
    pPasswordLineEdit->setEchoMode(QLineEdit::Password);//隐藏
    pRememberCheckBox->setText(codec->toUnicode("记住密码"));
    pAutoLoginCheckBox->setText(codec->toUnicode("自动登录"));
    pLoginButton->setText(codec->toUnicode("登录"));
    pRegisterButton->setText(codec->toUnicode("注册账号"));
    pForgotButton->setText(codec->toUnicode("找回密码"));
    page_up->setText(codec->toUnicode("上一页"));
    QGridLayout *pLayout = new QGridLayout();
    // 头像 第0行,第0列开始,占3行1列
    pLayout->addWidget(pImageLabel, 0, 0, 3, 1);
    // 用户名输入框 第0行,第1列开始,占1行2列
    pLayout->addWidget(pUserLineEdit, 0, 1, 1, 2);
    pLayout->addWidget(pRegisterButton, 0, 4);
    // 密码输入框 第1行,第1列开始,占1行2列
    pLayout->addWidget(pPasswordLineEdit, 1, 1, 1, 2);
    pLayout->addWidget(pForgotButton, 1, 4);
    // 记住密码 第2行,第1列开始,占1行1列 水平居左 垂直居中
    pLayout->addWidget(pRememberCheckBox, 2, 1, 1, 1, Qt::AlignLeft | Qt::AlignVCenter);
    // 自动登录 第2行,第2列开始,占1行1列 水平居右 垂直居中
    pLayout->addWidget(pAutoLoginCheckBox, 2, 2, 1, 1, Qt::AlignRight | Qt::AlignVCenter);
    // 登录按钮 第3行,第1列开始,占1行2列
    pLayout->addWidget(pLoginButton, 3, 1, 1, 2);
    pLayout->addWidget(page_up,3,4);//设置上一页在第三行第四列
    connect(page_up,&QPushButton::clicked,[&](){
       win->show();
    });
    // 设置水平间距
    pLayout->setHorizontalSpacing(10);
    // 设置垂直间距
    pLayout->setVerticalSpacing(10);
    // 设置外间距
    pLayout->setContentsMargins(10, 10, 10, 10);//边框间距设置
    newweigdet->setLayout(pLayout);//添加进窗口部件
    newweigdet->show();//显示窗口部件
}

ui界面设计

由于是通过纯代码实现,所以ui界面是空的,不信你看:

实际具体细看代码如何实现,注释的已经很清晰了。

登录界面为例

以下如图:第一页

实际运行CTRL+R,点击下一页如图:

总结

学习QT并不是一朝一夕,庞大的函数库,需要巨大的精力投入学习,掌握基础方法后,通过QT手册边学边做,而布局管理器几乎所有项目都要用到,美观的外表非常的重要。

到此这篇关于QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用的文章就介绍到这了,更多相关QT布局管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt实现简易QQ聊天界面

    本文实例为大家分享了Qt实现简易QQ聊天界面的具体代码,供大家参考,具体内容如下 代码 myDialog.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QWidget> #include <QToolButton> #include <QVBoxLayout> #include <QHBoxLayout> #include <QList> class MyDialog : public

  • Qt实现电子时钟的示例代码

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 添加新文件 4.2 digiclock.h头文件 4.3 digiclock.cpp源文件 4.4 main.cpp源文件 五.效果演示 一.项目介绍 利用Qt实现显示与桌面上并可以随意拖拽至桌面任意位置的电子时钟案例. 二.项目基本配置 新建一个Qt案例,项目名称为“Clock”,基类选择“QDialog”,取消创建UI界面复选框的选中状态. 三.UI界面设计 无UI界面 四.主程序实现 4.1 添加新文件 添加新

  • 基于Qt实现简易GIF播放器的示例代码

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 五.效果演示 一.项目介绍 利用Qt设计一个简易GIF播放器,可以播放GIF动画.其基本功能有载入文件.播放.暂停.停止.快进和快退. 二.项目基本配置 新建一个Qt案例,项目名称为“GIFTest”,基类选择“QMainWindow”,创建UI界面复选框的选中状态,完成项目创建. 三.UI界面设计 UI界面如下: 界面中创建了8个控件,其名

  • Qt控件点击消息获取的方法详解

    目录 1.QPushButton响应鼠标点击消息 1.1自身响应消息clicked 1.2事件过滤器响应消息 1.3mousePressEvent事件获取 2.QLabel响应鼠标点击消息 2.1事件过滤器响应消息 2.2mousePressEvent事件获取 今日为大家分享一个小功能实现:如何获取控件点击响应. 在这里,我以两个最简单并且具有代表性的控件来进行功能讲解. 举例控件:QLabel.QPushButton 对于这两个控件大家应该都不会陌生了,做界面开发经常会用到的. 开发环境:VS

  • Qt实现电子时钟

    本文实例为大家分享了Qt实现电子时钟的具体代码,供大家参考,具体内容如下 进一步认识Qt中的属性,我们现在再做一个小练习,去实现一个简易版电子时钟的效果. 效果展示: 新建项目: 我们创建了lcdclock2类,其实是没有用到的,实际上是添加新一个C++文件来实现电子钟. 添加C++文件: 代码: clock.h #ifndef CLOCK_H #define CLOCK_H   #include <QDialog>   class clock : public QDialog {     Q

  • QT5实现电子时钟

    本文实例为大家分享了QT5实现电子时钟的具体代码,供大家参考,具体内容如下 一.电子时钟的显示 效果如下: 电子时钟显示 二.新建工程 Widgets Application项目名位clock,基础类位QDialog,取消创建UI界面的勾选框,项目名右击添加新文件 在弹出的对话框中选择“C++ Class”,Base class基础类名“QLCDNumber”,class name命名为digiclock,点击完成. 三.编辑digiclock.h文件 #ifndef DIGICLOCK_H #

  • 详解Qt使用QImage类实现图像基本操作

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 利用QImage类实现对图像的基本操作,包括图像显示.图像缩放.图像旋转等. 二.项目基本配置 新建一个Qt案例,项目名称为“ImageTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建. 三.UI界面设计 UI界面布局如下: 界面中创建了5个控件,其名称和类型如下: 序号 名称 类型 属性 ① Ch

  • Qt实现拖动单个控件移动的示例代码

    目录 1.设置窗口拖拽属性 2.创建初始控件 3.选中控件进行拖动 3.1响应mousePressEvent事件 3.2判断控件拖动 3.3事件处理 3.4结束拖动 做惯了静态图,今天来搞一搞动态图吧,首先来个最基础的功能:如果让一个控件拖动起来. 展示效果: 按照以往简单的做法,使用mouseMoveEvent.mousePressEvent.mouseReleaseEvent也是可以实现的.这是最基础的移动做法. 今天,不使用那种简单的做法,采用Qt一种特有的拖动方法来实现! 使用QDrop

  • QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用

    目录 main.cpp mainwindow.h mainwindow.cpp ui界面设计 登录界面为例 总结 main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; return a.exec(); } mainwindow.h #ifndef MAINWIND

  • PyQt Qt Designer工具的布局管理详解

    前言 这节课很重要..界面整洁美观与否就看布局了..这里讲布局方法,至于设计的天赋与最终界面的美感那就看造化了.. 本文主要讲述Qt Designer工具实现界面控件布局管理,就是排列组合控件.包括水平布局.垂直布局.网格布局.表单布局.至于绝对布局太复杂..短期内hold不住 布局管理打开方法 方法一:Qt Designer -> Form菜单栏 方法二:右键单击主窗口 -> Lay out 四种布局管理介绍 (1)水平布局 Lay Out Horizontally:被选中的控件在水平方向上

  • Python深度学习实战PyQt5窗口切换的堆叠布局示例详解

    目录 1. 堆叠布局简介 1. 1什么是堆叠布局(Stacked Layout) 1.2 堆叠布局的实现方法 2. 创建多窗口切换的堆叠布局 3. 堆叠布局的主程序设计 3.1 QStackedWidget 类 3.2 建立信号/槽连接 3.3 页面控制程序 3.4 堆叠布局中的控件操作 软件项目中经常需要多种不同的图形界面,以适应不同的任务场景.选项卡控件(QTackedWidget)通过标签选择打开对应的对话框页面,不需要另外编程.堆叠窗口控件(QStackedWidget)在主程序中通过编

  • C语言与C++中内存管理详解

    目录 内存分布 动态内存管理方式-堆区 C语言动态内存管理 C++动态内存管理 new和delete的用法 operator new与operator delete函数 new和delete的实现原理 定位new表达式 高频面试题 重点new/delete和malloc/free的区别 内存泄漏 内存分布 主要段及其分布 ​ 每个程序运行起来以后,它将拥有自己独立的虚拟地址空间.这个虚拟地址空间的大小与操作系统的位数有关系.32位硬件平台的虚拟地址空间的地址可以从0~2^32-1,即0x0000

  • antd Vue实现Login登录页面布局案例详解 附带验证码验证功能

    效果 Login页面 <!-- * @Author: Jackie * @Date: 2022-05-07 14:34:06 * @LastEditTime: 2022-05-09 15:57:44 * @LastEditors: Jackie * @Description: 登录页 用户名-密码-验证码登录方式 * @FilePath: /vue-admin-template/src/views/Login.vue * @version: --> <template> <d

  • Android开发之基本控件和四种布局方式详解

    Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

  • JVM内存管理之JAVA语言的内存管理详解

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个"不懂内存"的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不

  • Crashlytics Android 异常报告统计管理(详解)

    简介 Crashlytic 成立于2011年,是专门为移动应用开者发提供的保存和分析应用崩溃信息的工具.Crashlytics的使用者包括:支付工具Paypal, 点评应用Yelp, 照片分享应用Path, 团购应用GroupOn等移动应用. 2013年1月,Crashlytics被Twitter收购,成为又一个成功的创业产品.被收购之后,由于没有了创业公司的不稳定因素,我们更有理由使用它来分析应用崩溃信息. 使用Crashlytics的好处有: 1.Crashlytics不会漏掉任何应用崩溃信

  • Android开发高仿课程表的布局实例详解

    先说下这个demo,这是一个模仿课程表的布局文件,虽然我是个菜鸟,但我还是想留给学习的人一些例子,先看下效果 然后再来看一下我们学校的app 布局分析 先上一张划分好了的布局图 首先整个页面放在一个LinearLayout布局下面,分为上面和下面两个部分,下面一个是显示课程表的详细信息 1:这个没什么好讲的,就是直接一个LinearLayout布局,然后将控件一个TextView用来显示年份,一个View用来当作竖线,一个Spinner用来显示选择周数 2:这个是显示星期几的部件,是我自定义的V

  • django站点管理详解

    管理界面是基础设施中非常重要的一部分.这是以网页和有限的可信任管理者为基础的界面,它可以让你添加,编辑和删除网站内容.Django有自己的自动管理界面.这个特性是这样起作用的:它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即工作. Django的管理员模块是Django的标准库django.contrib的一部分.这个包还包括其它一些实用的模块: django.contrib.auth django.contrib.sessions django.contr

随机推荐