(六)QT——布局&常用控件——基本的用户输入界面

embedded/2025/2/12 8:58:43/

目录

前言

布局管理器

常用控件

控件与布局结合

动态控件和布局

布局管理器组织控件

总结

1. 布局管理器(Layout Managers)

2. 控件(Widgets)

3. 布局与控件的结合

4. 交互与信号槽机制


前言

在Qt中,布局管理器用于自动安排控件的位置和大小,而控件是构建用户界面的基本元素。通过合理使用布局和控件,可以实现功能丰富且美观的用户界面。


布局管理器

布局管理器控制着控件在窗口中的位置。Qt提供了多种布局类型,适应不同的界面需求。

QHBoxLayout(水平布局)

  • 作用:将控件水平排列。
  • 使用场景:需要控件横向排列的场合,如工具条、按钮组等。
QWidget *window = new QWidget;
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(new QPushButton("Button 1"));
layout->addWidget(new QPushButton("Button 2"));
window->setLayout(layout);
window->show();

QVBoxLayout(垂直布局)

  • 作用:将控件垂直排列。
  • 使用场景:当需要控件竖直排列时,如表单、选项卡等。
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(new QLabel("Label 1"));
layout->addWidget(new QLabel("Label 2"));

QGridLayout(网格布局)

  • 作用:按行列安排控件。
  • 使用场景:需要将控件按表格形式排列,如计算器、数据表单等。
QGridLayout *gridLayout = new QGridLayout;
gridLayout->addWidget(new QLabel("Row 1, Column 1"), 0, 0);
gridLayout->addWidget(new QLabel("Row 1, Column 2"), 0, 1);
gridLayout->addWidget(new QLabel("Row 2, Column 1"), 1, 0);

QFormLayout(表单布局)

  • 作用:适用于标签和输入框的排列,一般用于表单。
  • 使用场景:如设置界面、信息录入界面。
QFormLayout *formLayout = new QFormLayout;
QLineEdit *lineEdit = new QLineEdit;
formLayout->addRow("Username:", lineEdit);

常用控件

QPushButton(按钮)

  • 作用:触发某些操作,如提交、取消等。
  • 常见方法setText() 设置按钮文本,clicked() 信号。
QPushButton *button = new QPushButton("Click Me");
connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);

QLabel(标签)

  • 作用:显示文本或图片。
  • 常见方法setText() 设置文本,setPixmap() 设置图片。
QLabel *label = new QLabel("Hello, Qt!");
label->setText("Updated Text");

QLineEdit(单行文本框)

  • 作用:输入单行文本。
  • 常见方法setText() 设置文本,text() 获取文本,setPlaceholderText() 设置占位符。
QLineEdit *lineEdit = new QLineEdit;
lineEdit->setPlaceholderText("Enter text...");

QTextEdit(多行文本框)

  • 作用:输入或显示多行文本,支持换行和滚动条。
  • 常见方法setPlainText() 设置文本,toPlainText() 获取文本。
QTextEdit *textEdit = new QTextEdit;
textEdit->setPlainText("Multiline text...");

QCheckBox(复选框)

  • 作用:表示可选择的状态(选中或未选中)。
  • 常见方法setChecked() 设置选中状态,isChecked() 获取选中状态。
QCheckBox *checkBox = new QCheckBox("I agree");
bool isChecked = checkBox->isChecked();

QRadioButton(单选按钮)

  • 作用:在一组选项中选择一个。
  • 常见方法setChecked() 设置选中状态,isChecked() 获取选中状态。
QRadioButton *radioButton = new QRadioButton("Option 1");
radioButton->setChecked(true); // 选中

QComboBox(下拉框)

  • 作用:提供一个下拉菜单,允许用户选择一个选项。
  • 常见方法addItem() 添加选项,currentText() 获取当前选择的文本。
QComboBox *comboBox = new QComboBox;
comboBox->addItem("Option 1");
comboBox->addItem("Option 2");
QString selected = comboBox->currentText();

QSpinBox(数字输入框)

  • 作用:输入整数,支持上下箭头调整数值。
  • 常见方法setRange() 设置范围,value() 获取当前值。
QSpinBox *spinBox = new QSpinBox;
spinBox->setRange(1, 100);  // 1到100之间的整数
int value = spinBox->value();

QSlider(滑动条)

  • 作用:通过拖动滑块选择数值。
  • 常见方法setRange() 设置范围,value() 获取当前值。
QSlider *slider = new QSlider(Qt::Horizontal);
slider->setRange(0, 100);
int value = slider->value();

QProgressBar(进度条)

  • 作用:显示任务进度。
  • 常见方法setRange() 设置进度范围,setValue() 设置当前进度。
QProgressBar *progressBar = new QProgressBar;
progressBar->setRange(0, 100);
progressBar->setValue(50);

QTableWidget(表格控件)

  • 作用:显示二维表格数据。
  • 常见方法setItem() 设置表格项,item() 获取指定单元格的项。
QTableWidget *tableWidget = new QTableWidget(3, 3); // 3行3列
tableWidget->setItem(0, 0, new QTableWidgetItem("Item 1"));

QTreeWidget(树形控件)

  • 作用:显示树状数据结构。
  • 常见方法addTopLevelItem() 添加顶层项,addChild() 添加子项。
QTreeWidget *treeWidget = new QTreeWidget;
QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
item->setText(0, "Root Item");

QTabWidget(标签页控件)

  • 作用:通过多个标签页切换不同的视图。
  • 常见方法addTab() 添加标签页,setTabText() 设置标签页文本。
QTabWidget *tabWidget = new QTabWidget;
QWidget *tab1 = new QWidget;
tabWidget->addTab(tab1, "Tab 1");

控件与布局结合

在Qt中,布局管理器与控件的使用通常结合在一起,以创建一个完整的图形界面。

一个常见的表单界面通常会使用QFormLayout结合QLineEditQLabel,如下所示:

QFormLayout *formLayout = new QFormLayout;
QLineEdit *nameEdit = new QLineEdit;
QLineEdit *emailEdit = new QLineEdit;
formLayout->addRow("Name:", nameEdit);
formLayout->addRow("Email:", emailEdit);QWidget *formWidget = new QWidget;
formWidget->setLayout(formLayout);
formWidget->show();

动态控件和布局

可以在运行时根据需要动态添加或删除控件和布局。例如,在按钮点击事件中动态添加新的控件:

QPushButton *button = new QPushButton("Add Label");
connect(button, &QPushButton::clicked, [=] {QLabel *newLabel = new QLabel("New Label");layout->addWidget(newLabel);
});

布局管理器组织控件

为了展示如何在一个Qt应用程序中使用布局和控件,下面我将提供一个完整的Qt程序文件实例。这个实例展示了如何使用QWidgetQPushButtonQLabelQLineEditQFormLayout等控件,以及如何通过布局管理器来组织这些控件。

以下是一个基于Qt的简单示例程序,它使用了QVBoxLayout(垂直布局)和QFormLayout(表单布局)来安排控件,并实现一个简单的用户输入界面。

  • 打开 Qt Creator,点击 “新建项目”(New Project)。
  • 选择 “Qt Widgets Application”(Qt Widgets 应用程序)。
  • 设置 项目名称(如 QtLayoutExample),选择保存路径,点击 下一步
  • 选择 Qt 版本,保持默认,点击 下一步
  • 选择 CMake 或 qmake(如果你不确定,选择 qmake)。
  • 点击 完成(Finish)。

main.cpp

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow w;  // 使用 MainWindoww.show();return app.exec();
}

修改 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QFormLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void onSubmitClicked();private:Ui::MainWindow *ui;QLineEdit *nameEdit;QLineEdit *emailEdit;
};#endif // MAINWINDOW_H

修改 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// 创建中心 WidgetQWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);// 创建主布局(垂直布局)QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);// 创建表单布局QFormLayout *formLayout = new QFormLayout;nameEdit = new QLineEdit;emailEdit = new QLineEdit;formLayout->addRow("姓名:", nameEdit);formLayout->addRow("邮箱:", emailEdit);// 将表单布局添加到主布局中mainLayout->addLayout(formLayout);// 创建并添加提交按钮QPushButton *submitButton = new QPushButton("提交");mainLayout->addWidget(submitButton);// 连接按钮的点击事件connect(submitButton, &QPushButton::clicked, this, &MainWindow::onSubmitClicked);
}MainWindow::~MainWindow() {delete ui;
}// 提交按钮点击槽函数
void MainWindow::onSubmitClicked() {QString name = nameEdit->text();QString email = emailEdit->text();if (name.isEmpty() || email.isEmpty()) {QMessageBox::warning(this, "输入错误", "姓名和邮箱不能为空!");} else {QMessageBox::information(this, "提交成功", "姓名: " + name + "\n邮箱: " + email);}
}
  • 启动程序后,会显示一个窗口,包含两个输入框(姓名邮箱)以及一个 提交 按钮。
  • 当点击 提交 按钮时,会根据输入框的内容弹出 信息对话框
    • 如果输入为空,会弹出 警告对话框,提示用户输入不能为空。
    • 如果输入有效,会弹出 提交成功对话框,显示用户输入的姓名和邮箱。


总结

在 Qt 中,布局管理器控件 是构建图形用户界面的基本组成部分。它们密切配合,通过灵活的排布和互动,实现了界面的自动化和动态响应。以下是关键点的总结:

1. 布局管理器(Layout Managers)

布局管理器负责 自动安排控件的位置和大小,使得界面元素在不同屏幕尺寸和分辨率下能够自适应。Qt 提供了多种布局管理器,常用的包括:

  • QVBoxLayout:垂直布局,将控件按竖直方向排列。
  • QHBoxLayout:水平布局,将控件按水平方向排列。
  • QGridLayout:网格布局,用于将控件放置到行和列中。
  • QFormLayout:表单布局,适用于标签和输入框的排列,常用于用户输入界面。

布局管理器确保控件的自动对齐、间距设置、尺寸调整等,使得界面更加整洁、动态且易于维护。

2. 控件(Widgets)

控件是构成用户界面的基本元素,用户与程序的交互主要通过控件来完成。常见的 Qt 控件有:

  • QPushButton:按钮,用于触发动作。
  • QLabel:标签,用于显示文本或图片。
  • QLineEdit:单行文本框,用于用户输入。
  • QTextEdit:多行文本框,用于较长文本输入。
  • QComboBox:下拉框,用于选择一个选项。
  • QCheckBox:复选框,用于二选一的选择。
  • QRadioButton:单选框,通常用于一组选项中的单一选择。

通过合理配置控件,能够满足用户输入、显示信息、选择功能等多种需求。

3. 布局与控件的结合

  • 自动布局:通过选择合适的布局管理器,控件会自动调整其位置和大小,以适应不同的窗口大小变化。例如,使用 QVBoxLayout 可以将控件按垂直顺序排列,自动调整控件的高度和间距。
  • 嵌套布局:可以将一个布局管理器嵌套在另一个布局管理器中。例如,在一个 QVBoxLayout 中嵌套一个 QFormLayout,实现更复杂的控件排列。
  • 动态响应:布局管理器能够根据用户窗口的大小调整控件的显示,确保用户界面在不同设备和窗口尺寸下都能够良好展示。

4. 交互与信号槽机制

Qt 的信号槽机制用于实现控件之间的交互。用户操作控件(如点击按钮、输入文本)时,会触发信号,信号与槽函数关联后,能够执行相应的操作。

通过合理使用 布局管理器控件,你可以创建功能丰富且美观的用户界面,保证其在不同的屏幕和设备上都能良好适配。布局管理器不仅帮助自动排布控件,还能确保界面元素的自适应和动态调整。而控件是界面的基本交互元素,通过信号与槽机制,它们能够响应用户输入并触发相应的操作。


http://www.ppmy.cn/embedded/161251.html

相关文章

【数据结构】栈与队列

栈 栈的概念及结构 栈:一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈&…

LeetCode刷题---数组---628

三个数最大的乘积 628. 三个数的最大乘积 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#x…

深入解析 Sojson.v6 混淆加密机制

一、引言 1. 什么是 Sojson&#xff1f; Sojson 是一款广泛应用于 JavaScript 代码保护的混淆工具&#xff0c;其核心目标是通过复杂的代码转换技术&#xff0c;使得原始代码难以被逆向分析或直接复制。它通过重命名变量、插入冗余逻辑、加密字符串等手段&#xff0c;显著提升…

route 与 router 之间的差别

简述&#xff1a; router&#xff1a;主要用于处理一些动作&#xff0c; route&#xff1a;主要获得或处理一些数据&#xff0c;比如地址、参数等 例&#xff1a; videoInfo1.vue&#xff1a; <template><div class"video-info"><h3>二级组件…

DeepSeek与Vue.js携手:打造高效分页组件之旅

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

《ARM64体系结构编程与实践》学习笔记(四)

MMU内存管理 1.MMU内存管理&#xff08;armv8.6手册的D5章节&#xff09;&#xff0c;MMU包含快表TLB&#xff0c;TLB是对页表的部分缓存&#xff0c;页表是存放在内存里面的。 AArch64仅仅支持Long Descriptor的页表格式&#xff0c;AArch32支持两种页表格式Armv7-A Short De…

[含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的心血管疾病分析系统

大数据项目-Django基于大数据实现的心血管疾病分析系统背景可以从以下几个方面进行阐述&#xff1a; 一、项目背景与意义 1. 心血管疾病现状 心血管疾病是当前全球面临的主要健康挑战之一&#xff0c;其高发病率、高致残率和高死亡率严重威胁着人类的生命健康。根据权威机构…

Spring Boot单元测试实战指南

在开发Spring Boot应用时&#xff0c;单元测试是确保代码质量和稳定性的重要环节。Spring Boot提供了强大的测试支持&#xff0c;通过spring-boot-starter-test模块&#xff0c;我们可以轻松地进行单元测试。本文将通过一个实际案例&#xff0c;详细介绍如何为Spring Boot应用编…