Qt使用代码放置控件并布局

这篇具有很好参考价值的文章主要介绍了Qt使用代码放置控件并布局。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        上一章中我们从头一步一步地新建项目并运行了窗口,本章就正式踏入Qt界面编程之路。在本章节,我们先用代码编写界面,进行简单的控件放置,然后用代码进行布局;之后使用Qt Designer进行控件放置和界面布局,这使得复杂界面的设计变得简单起来。

1.主窗口的组成

        对于界面设计来说,Qt的窗口相当于一张画布,设计人员可以在这张画布上任意的绘画,我们按照“国际惯例”,先实现一个“Hello World”字符显示作为入门demo。

        在上一章中,新建的空白项目直接运行的窗口如下:

Qt使用代码放置控件并布局

        这个窗口看似空空如也,实则暗藏玄机,窗口上有几个默认的控件,见下图:

Qt使用代码放置控件并布局

         从上图标示可以看出,窗口的上部分是菜单栏,下部分是状态栏,中间那个大区域是中心控件。菜单栏是放置菜单的地方;状态栏可以显示如一些操作动作或信息;中心控件是我们所谓的“画布”,用来放置控件、布局的地方。

2使用代码放置控件

        我们暂时不去管菜单栏和状态栏,这个我们之后再慢慢玩。中心控件区域是我们放置控件的地方,我们用代码编写在中心控件区域放置一个“Hello World”字符。

        在编写代码之前,我们先看下Qt自动生成的mainwindow.cpp文件中的内容:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

        该文件默认有三个部分,分别是头文件包含、构造函数、析构函数,我们在构造函数中放置一个用于显示字符串的标签,该控件是QLabel(使用之前先包含QLabel的头文件),并将该标签的文本设置为“Hello World”,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>  // 包含QLabel的头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /* 实例一个QLabel对象指针label,
     * 并将中心控件的指针(this->centralWidget()返回中心控件的指针)传入QLabel的构造函数,
     * 表示QLabel的父类是中心控件,即QLabel会显示在中心控件区域 */
    QLabel *label = new QLabel(this->centralWidget());
    // 设置标签文本
    label->setText("Hello World");
}

MainWindow::~MainWindow()
{
    delete ui;
}

        上述增加的代码给出了注释,运行程序,显示的窗口如下:Qt使用代码放置控件并布局

         当看到窗口中出现了“HelloWorld”字符串,恭喜你,实现了Qt第一个界面程序。

        这里必须指明一点,就是Qt编程中实例的控件一般情况下都是使用指针变量,这样控件不会随着函数的生命周期结束而结束,如果你在构造函数中这样声明QLabel变量:

QLabel label(this->centralWidget());

label.setText("Hello World");

        那么你在运行后会发现窗口还是空空如也,没有显示你想要的字符串。因为label这个变量是构造函数的局部变量,当构造函数运行完毕后,label变量也随之释放。使用指针变量,只要不是人为地去释放指针,则指针变量会一直存在。

        虽然实现了“Hello World”字符串在窗口中显示,但是你可能会想,如何将这个字符串放置在窗口的其它位置。在研究字符串放置的位置之前,我们得先知道窗口的坐标是如何规定的,下面我们看下Qt窗口的坐标系统是什么样的,见下图:

Qt使用代码放置控件并布局

         从图中可以看出,Qt窗口的左上角坐标是(0,0),向右走是X轴正方向,向下走是Y轴正方向。那么,这个窗口究竟多大的呢,我们可以使用函数获取,再将它们显示在标签上,见如下代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>  // 包含QLabel的头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 获取窗口宽度
    int width = this->width();
    // 获取窗口高度
    int height = this->height();

    QLabel *label = new QLabel(this->centralWidget());
    // 显示出窗口宽度和高度
    label->setText(QString::number(width) + " " + QString::number(height));
}

MainWindow::~MainWindow()
{
    delete ui;
}

        以上代码中,先通过this->width()和this->height()两个函数获取窗口的宽度和高度,然后显示在标签中。其中QString::number(width)和QString::number(height)是将数值转换成字符串,因为setText()函数只能传入字符串变量QString。运行程序,显示的窗口如下:Qt使用代码放置控件并布局

        从窗口中显示的字符串可以看到,该窗口的宽度是800像素点,高度是600像素点。接下来我们将“Hello World”的标签换个位置放置,代码修改如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>  // 包含QLabel的头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QLabel *label = new QLabel(this->centralWidget());
    // 设置文本
    label->setText("Hello World");
    // 设置标签的位置和大小
    label->setGeometry(0, 300, 80, 30);
}

MainWindow::~MainWindow()
{
    delete ui;
}

        这里使用了QLabel的函数setGeometry(int ax, int ay, int aw, int ah),该函数有四个参数,依次是控件要设置的x轴坐标、y轴坐标、控件的宽度、控件的高度,这里我们设置“Hello World”标签的位置为(0,300),标签的宽度为80、高度为30。这里要注意的是,Qt中所有的控件的起始坐标都是控件的左上角,放置的位置也是以控件的(0,0)坐标为参考点,比如说这里把“Hello World”标签放置在窗口的(0,300)位置,准确地说,是把标签的(0,0)坐标点放置在窗口的(0,300)位置 。运行程序,显示的窗口如下:Qt使用代码放置控件并布局

         “Hello World”字符串放置在了我们设置的地方,程序运行成功!

3使用代码进行界面布局

        我们在界面上放置3个控件,分别是标签控件QLabel、行输入控件QLineEdit和按钮控件QPushButton,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>       // 包含QLabel的头文件
#include <QLineEdit>    // 包含QLineEdit的头文件
#include <QPushButton>  // 包含QPushButton的头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 标签控件
    QLabel *label = new QLabel(this->centralWidget());
    // 设置标签文本
    label->setText("Hello World");
    // 设置位置和大小
    label->setGeometry(0, 0, 80, 25);

    // 行输入控件
    QLineEdit *lineEdit = new QLineEdit(this->centralWidget());
    // 设置位置和大小
    lineEdit->setGeometry(100, 0, 80, 25);

    // 按钮控件
    QPushButton *pushButton = new QPushButton(this->centralWidget());
    // 设置按钮文本
    pushButton->setText("我是按钮");
    // 设置位置和大小
    pushButton->setGeometry(200, 0, 80, 25);
}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行程序,显示的窗口如下:

Qt使用代码放置控件并布局

         可以看到,三个控件按我们给定的位置和大小在窗口中水平排列,因为我们给定的是控件的绝对位置和绝对大小,所以控件的位置和大小不会随着窗口的大小变化而自动变化,有时会出现窗口显示不全控件的情况,如下图所示:

Qt使用代码放置控件并布局

         为了让控件的位置和大小随着窗口大小的改变而自动变化,使控件能够自适应窗口的变化,我们使用Qt的水平布局控件QHBoxLayout。QHBoxLayout是水平布局控件,放置在QHBoxLayout里的控件会自动水平分布,并且随着QHBoxLayout的大小变化而自动变化,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>       // 包含QLabel的头文件
#include <QLineEdit>    // 包含QLineEdit的头文件
#include <QPushButton>  // 包含QPushButton的头文件
#include <QHBoxLayout>  // 包含QHBoxLayout的头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 标签控件
    QLabel *label = new QLabel;
    // 设置标签文本
    label->setText("Hello World");

    // 行输入控件
    QLineEdit *lineEdit = new QLineEdit;

    // 按钮控件
    QPushButton *pushButton = new QPushButton;
    // 设置按钮文本
    pushButton->setText("我是按钮");

    // 水平布局控件
    QHBoxLayout *hBoxLayout = new QHBoxLayout(this->centralWidget());
    hBoxLayout->addWidget(label);
    hBoxLayout->addWidget(lineEdit);
    hBoxLayout->addWidget(pushButton);
}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行程序,显示的窗口如下:Qt使用代码放置控件并布局

         可以看出,三个控件水平分布在窗口中,将窗口的横坐标填充满,当我们缩小或放大窗口时,控件的大小和位置会跟随着窗口的大小变化而变化,起到控件自适应窗口大小的效果。

        当然,有水平布局控件就有垂直布局控件,我们将上面的QHBoxLayout改为QVBoxLayout看看什么效果,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>       // 包含QLabel的头文件
#include <QLineEdit>    // 包含QLineEdit的头文件
#include <QPushButton>  // 包含QPushButton的头文件
#include <QVBoxLayout>  // 包含QVBoxLayout的头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 标签控件
    QLabel *label = new QLabel;
    // 设置标签文本
    label->setText("Hello World");

    // 行输入控件
    QLineEdit *lineEdit = new QLineEdit;

    // 按钮控件
    QPushButton *pushButton = new QPushButton;
    // 设置按钮文本
    pushButton->setText("我是按钮");

    // 垂直布局控件
    QVBoxLayout *vBoxLayout = new QVBoxLayout(this->centralWidget());
    vBoxLayout->addWidget(label);
    vBoxLayout->addWidget(lineEdit);
    vBoxLayout->addWidget(pushButton);
}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行程序,显示的窗口如下:

Qt使用代码放置控件并布局

         可以看出,三个控件按垂直方向分布,当缩小窗口后,三个控件的大小和位置会随窗口的改变而改变。比如,窗口缩小后,效果如下图:

Qt使用代码放置控件并布局

         窗口是不是变得紧凑且美观了一些。

        QHBoxLayout和QVBoxLayout可以相互嵌套使用,除了这两个布局控件,Qt还有网格布局控件QGridLayout和表单布局控件QFormLayout,大家可以自行了解,在需要的时候使用。

4总结

        在这一章中,我们使用代码放置了几个控件,并使用了QHBoxLayout和QVBoxLayout布局控件对其进行了水平布局和垂直布局。这一章通过编写代码放置控件并布局,只是让我们初步了解Qt的界面编程,对于复杂点的界面设计,我推荐大家使用Qt自带的界面设计软件Qt Designer,使用它可以大大简化界面设计的工作量,并且设计逻辑清晰易于维护,界面直观,所见即所得。但如果涉及到控件大小和位置的动态修改,还是得使用代码直接编程。文章来源地址https://www.toymoban.com/news/detail-471225.html

到了这里,关于Qt使用代码放置控件并布局的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT基础入门【布局篇】消除控件之间的间隔

    layoutLeftMargin: layout内的布局距离边框左端的距离。 layoutTopMargin: layout内的布局距离边框顶端的距离。 layoutRightMargin: layout内的布局距离边框右端的距离。 layoutBottomMargin: layout内的布局距离边框底端的距离。 layoutHorizontalSpacing: layout内的水平方向内的对象(包括控件和低一级布局

    2024年01月19日
    浏览(39)
  • Qt Designer 控件箱中的控件介绍及布局比列分配

    控件箱介绍                 Qt Designer的控件箱(Widget Box)包含了各种常用的控件,用户可以通过拖放的方式将这些控件添加到窗体设计器中,用于构建用户界面。以下是一些常见控件箱中的控件及其功能的讲解: 1. 基本控件 : 标签(Label) :用于显示文本或图像。

    2024年04月13日
    浏览(40)
  • Qt之格栅布局(QGridLayout)控件填满整个单元格

    Qt专栏: 目录 1.现象1 2.解决方案 3.现象2 4.解决方案 5.总结         今天在用QGridLayout布局的时候,添加到布局的QWidget有文本框、标签、组合框和按钮等等,布局两列,通过下面的方式添加进去的: 发现在窗口拉伸的时候,pEdit 不会填满第0行1列的位置,右边有空隙。    

    2024年04月15日
    浏览(82)
  • QT自定义优雅的表单控件,简单实现设置界面布局

    FormView.h FormView.cpp 核心函数 函数 变量 功能 addEditableItem title: 输入框前面的提示文字,同时作为该控件的标识符 place_holder: 输入框中的提示文字 在表单中插入一个可填写项 addCheckableItem title: 不显示在UI中,仅作为该控件的标识符 content: 勾选框后面的内容 init_status: 勾选框的初

    2024年02月11日
    浏览(47)
  • 开源Qt Ribbon控件——SARibbon的布局思路及介绍

    原文链接:https://blog.csdn.net/czyt1988/article/details/113811620 https://devpress.csdn.net/gitcode/6412b1fe986c660f3cf9294a.html?spm=1001.2101.3001.6650.4utm_medium=distribute.pc_relevant.none-task-blog-2 default CTRLIST activity-4-108312948-blog-126431338.235^v31^pc_relevant_default_base3depth_1-utm_source=distribute.pc_relevant.none-task-blog-2 defa

    2024年01月25日
    浏览(36)
  • 【QT】一 设置布局后,控件大小会自动变化,如何设置想要的

    目录 1. 设置好控件大小 2. 设置布局  3. 设置layout  给一个QWidget控件内部设置布局后,原来内部的控件大小变小了,如何解决?           把最小值设置好。         选择整体,选择布局方式,这里为水平布局。 你会发现,可能显示不全。 选择整体,属性拉到最下面,

    2024年02月11日
    浏览(81)
  • VS+Qt设置窗口尺寸(二):窗体控件自适应窗口布局,自动调整大小

    VS版本:VS2019 QT版本:Qt5.12.3(msvc2017_64) 为了适配不同尺寸的显示屏,软件窗口需要调整大小,窗口内的控件尺寸也要适配窗口的大小。 本例重点讲述如何设置可调整尺寸的窗口及控件,实现窗口最大化和尺寸调节。 本例使用相对简单的按键和文本框来做示例,其他控件均可

    2023年04月23日
    浏览(110)
  • 解决QT中UI控件布局更改后运行结果没有发生变化的问题

    在学习QT中,遇到了一个问题,那就是当我UI中更改了控件布局后,运行的结果却并没有发生改变,于是我上网查找了一些资料,大多略显麻烦。 效果如下:这是UI控件更改布局后  这是运行后结果 显然,UI文件中并没有更新。 我的解决方案是: 1.首先在项目文件中找到UI文件

    2024年02月11日
    浏览(82)
  • 【wxWidgets】使用布局控件进行窗口布局

    窗口布局基础 为了在各种环境中都能使窗口拥有合适的位置和大小,可能需要在OnSize事件中计算每一个窗口的大小并设置新位置,当然使用窗口布局控件可以更方便地实现 如果选择使用布局控件,可以通过自己编写或者使用工具来创建,也可以使用XRC文件布局的定义保存在

    2024年02月16日
    浏览(36)
  • Winform中实现窗体控件适配(自适应窗体)布局_通过C#代码方式

    即:未启用控件缩放效果代码时,控件内容都是固定在窗体界面的指定位置,不会跟随窗体的拉伸,放大而进行适配,如下图所示: 即:启用控件缩放效果代码时,控件内容会跟随窗体的拉伸,放大而进行适配,如下图所示: 实现思路是: ①在窗体初始化时先获取窗体的宽

    2023年04月17日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包