Qt5 C++入门教程-第10章 窗口小部件(Widgets)
bigegpt 2025-05-30 12:52 5 浏览
大道至简,在 Qt5 C++入门教程的这一部分,我们来谈谈一些基本的 Qt5 窗口小部件。我们有关于 QLabel、QSlider、QComboBox、QSpinBox、QLineEdit 和 QMainWindow 这些窗口小部件的示例。
窗口小部件(Widgets)是图形用户界面(GUI)应用程序的基本组成部分。Qt5 库拥有丰富多样的窗口小部件。
- Qt5 QLabel
QLabel 用于显示文本和图像。它不提供用户交互功能。下面的示例用于显示文本。
label.h
#pragma once
#include <QWidget>
#include <QLabel>
class Label : public QWidget {
public:
Label(QWidget *parent = nullptr);
private:
QLabel *label;
};
这是我们代码示例的头文件。
label.cpp
#include <QVBoxLayout>
#include <QFont>
#include "label.h"
Label::Label(QWidget *parent)
: QWidget(parent) {
QString lyrics = "Who doesn't long for someone to hold\n\
Who knows how to love you without being told\n\
Somebody tell me why I'm on my own\n\
If there's a soulmate for everyone\n\
\n\
Here we are again, circles never end\n\
How do I find the perfect fit\n\
There's enough for everyone\n\
But I'm still waiting in line\n\
\n\
Who doesn't long for someone to hold\n\
Who knows how to love you without being told\n\
Somebody tell me why I'm on my own\n\
If there's a soulmate for everyone";
label = new QLabel(lyrics, this);
label->setFont(QFont("Purisa", 10));
auto *vbox = new QVBoxLayout();
vbox->addWidget(label);
setLayout(vbox);
}
我们使用 QLabel 窗口小部件在窗口中显示歌词。
label = new QLabel(lyrics, this);
label->setFont(QFont("Purisa", 10));
我们创建一个标签窗口小部件,并为其设置特定的字体。
main.cpp
#include <QApplication>
#include <QTextStream>
#include "label.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Label window;
window.setWindowTitle("QLabel");
window.show();
return app.exec();
}
Qt5 QSlider
QSlider 是一个带有简单滑块的窗口小部件。这个滑块可以前后拉动。通过这种方式,我们可以为特定任务选择一个值。
slider.h
#pragma once
#include <QWidget>
#include <QSlider>
#include <QLabel>
class Slider : public QWidget {
Q_OBJECT
public:
Slider(QWidget *parent = nullptr);
private:
QSlider *slider;
QLabel *label;
};
slider.cpp
#include <QHBoxLayout>
#include "slider.h"
Slider::Slider(QWidget *parent)
: QWidget(parent) {
auto *hbox = new QHBoxLayout(this);
slider = new QSlider(Qt::Horizontal , this);
hbox->addWidget(slider);
label = new QLabel("0", this);
hbox->addWidget(label);
// connect(slider, &QSlider::valueChanged, label,
// static_cast<void (QLabel::*)(int)>(&QLabel::setNum));
connect(slider, &QSlider::valueChanged, label,
qOverload<int>(&QLabel::setNum));
}
我们显示两个窗口小部件:一个滑块和一个标签。滑块控制标签中显示的数字。
slider = new QSlider(Qt::Horizontal , this);
创建一个水平的 QSlider。
connect(slider, &QSlider::valueChanged, label,
qOverload<int>(&QLabel::setNum));
在这行代码中,我们将 valueChanged 信号连接到标签的内置 setNum 槽函数。由于 setNum 方法是重载的,我们使用 qOverload 来选择正确的方法。
main.cpp
#include <QApplication>
#include "slider.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Slider window;
window.setWindowTitle("QSlider");
window.show();
return app.exec();
}
- Qt5 QComboBox
QComboBox 是一个窗口小部件,它以占用最小屏幕空间的方式向用户展示一系列选项。它是一个选择窗口小部件,显示当前项目,并可以弹出一个可选择项目的列表。组合框可以是可编辑的,允许用户修改列表中的每个项目。
combobox.h
#pragma once
#include <QWidget>
#include <QComboBox>
#include <QLabel>
class ComboBoxEx : public QWidget {
Q_OBJECT
public:
ComboBoxEx(QWidget *parent = nullptr);
private:
QComboBox *combo;
QLabel *label;
};
我们使用两个窗口小部件:一个组合框和一个标签。
combobox.cpp
#include <QHBoxLayout>
#include "combobox.h"
ComboBoxEx::ComboBoxEx(QWidget *parent)
: QWidget(parent) {
QStringList distros = {"Arch", "Xubuntu", "Redhat", "Debian",
"Mandriva"};
auto *hbox = new QHBoxLayout(this);
combo = new QComboBox();
combo->addItems(distros);
hbox->addWidget(combo);
hbox->addSpacing(15);
label = new QLabel("Arch", this);
hbox->addWidget(label);
connect(combo, qOverload<const QString &>(&QComboBox::activated),
label, &QLabel::setText);
}
在这个示例中,组合框中选中的项目会显示在标签中。
QStringList distros = {"Arch", "Xubuntu", "Redhat", "Debian",
"Mandriva"};
一个 QStringList 存储了组合框的数据。我们有一个 Linux 发行版的列表。
combo = new QComboBox();
combo->addItems(distros);
创建一个 QComboBox,并使用 addItems 方法插入项目。
connect(combo, qOverload<const QString &>(&QComboBox::activated),
label, &QLabel::setText);
组合框的 activated 信号连接到标签的 setText 槽函数。
main.cpp
#include <QApplication>
#include "combobox.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
ComboBoxEx window;
window.resize(300, 150);
window.setWindowTitle("QComboBox");
window.show();
return app.exec();
}
这是应用程序的主文件。
- Qt5 QSpinBox
QSpinbox 是一个用于处理整数和离散值集合的窗口小部件。在我们的代码示例中,我们有一个 QSpinbox 窗口小部件。我们可以选择 0 到 99 的数字。当前选择的值会显示在一个标签窗口小部件中。
spinbox.h
#pragma once
#include <QWidget>
#include <QSpinBox>
class SpinBox : public QWidget {
Q_OBJECT
public:
SpinBox(QWidget *parent = nullptr);
private:
QSpinBox *spinbox;
};
spinbox.cpp
#include <QHBoxLayout>
#include <QLabel>
#include "spinbox.h"
SpinBox::SpinBox(QWidget *parent)
: QWidget(parent) {
auto *hbox = new QHBoxLayout(this);
hbox->setSpacing(15);
spinbox = new QSpinBox(this);
auto *lbl = new QLabel("0", this);
hbox->addWidget(spinbox);
hbox->addWidget(lbl);
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
lbl, qOverload<int>(&QLabel::setNum));
}
我们在窗口上放置一个 QSpinbox,并将其 valueChanged 信号连接到 QLabel 的 setNum 槽函数。
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
lbl, qOverload<int>(&QLabel::setNum));
我们需要使用两次 qOverload,因为信号和槽函数都是重载的。
main.cpp
#include <QApplication>
#include "spinbox.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
SpinBox window;
window.resize(250, 150);
window.setWindowTitle("QSpinBox");
window.show();
return app.exec();
}
- Qt5 QLineEdit
QLineEdit 是一个窗口小部件,允许输入和编辑一行纯文本。QLineEdit 窗口小部件提供了撤销 / 重做、剪切 / 粘贴和拖放功能。
在我们的示例中,我们展示三个标签和三个 QLineEdit 窗口小部件。
ledit.h
#pragma once
#include <QWidget>
class Ledit : public QWidget {
public:
Ledit(QWidget *parent = nullptr);
};
ledit.cpp
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include "ledit.h"
Ledit::Ledit(QWidget *parent)
: QWidget(parent) {
auto *name = new QLabel("Name:", this);
name->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
auto *age = new QLabel("Age:", this);
age->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
auto *occupation = new QLabel("Occupation:", this);
occupation->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
auto *le1 = new QLineEdit(this);
auto *le2 = new QLineEdit(this);
auto *le3 = new QLineEdit(this);
auto *grid = new QGridLayout();
grid->addWidget(name, 0, 0);
grid->addWidget(le1, 0, 1);
grid->addWidget(age, 1, 0);
grid->addWidget(le2, 1, 1);
grid->addWidget(occupation, 2, 0);
grid->addWidget(le3, 2, 1);
setLayout(grid);
}
我们显示三个标签和三个 QLineEdit 窗口小部件。这些窗口小部件由 QGridLayout 布局管理器进行布局。
main.cpp
#include "ledit.h"
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Ledit window;
window.setWindowTitle("QLineEdit");
window.show();
return app.exec();
}
- 状态栏
状态栏是一个面板,用于显示应用程序的状态信息。
在我们的示例中,我们有两个按钮和一个状态栏。当我们点击按钮时,每个按钮都会在状态栏显示一条消息。状态栏窗口小部件是 QMainWindow 窗口小部件的一部分。
statusbar.h
#pragma once
#include <QMainWindow>
#include <QPushButton>
class Statusbar : public QMainWindow {
Q_OBJECT
public:
Statusbar(QWidget *parent = nullptr);
private slots:
void OnOkPressed();
void OnApplyPressed();
private:
QPushButton *okBtn;
QPushButton *aplBtn;
};
statusbar.cpp
#include <QLabel>
#include <QFrame>
#include <QStatusBar>
#include <QHBoxLayout>
#include "statusbar.h"
Statusbar::Statusbar(QWidget *parent)
: QMainWindow(parent) {
auto *frame = new QFrame(this);
setCentralWidget(frame);
auto *hbox = new QHBoxLayout(frame);
okBtn = new QPushButton("OK", frame);
hbox->addWidget(okBtn, 0, Qt::AlignLeft | Qt::AlignTop);
aplBtn = new QPushButton("Apply", frame);
hbox->addWidget(aplBtn, 1, Qt::AlignLeft | Qt::AlignTop);
statusBar();
connect(okBtn, &QPushButton::clicked, this, &Statusbar::OnOkPressed);
connect(aplBtn, &QPushButton::clicked, this, &Statusbar::OnApplyPressed);
}
void Statusbar::OnOkPressed() {
statusBar()->showMessage("OK button pressed", 2000);
}
void Statusbar::OnApplyPressed() {
statusBar()->showMessage("Apply button pressed", 2000);
}
这是 statusbar.cpp 文件。
auto *frame = new QFrame(this);
setCentralWidget(frame);
将 QFrame 窗口小部件放置在 QMainWindow 窗口小部件的中心区域。中心区域只能容纳一个窗口小部件。
okBtn = new QPushButton("OK", frame);
hbox->addWidget(okBtn, 0, Qt::AlignLeft | Qt::AlignTop);
aplBtn = new QPushButton("Apply", frame);
hbox->addWidget(aplBtn, 1, Qt::AlignLeft | Qt::AlignTop);
我们创建两个 QPushButton 窗口小部件,并将它们放置在一个水平框中。按钮的父窗口小部件是 frame 窗口小部件。
statusBar();
要显示状态栏窗口小部件,我们调用 QMainWindow 窗口小部件的 statusBar 方法。
void Statusbar::OnOkPressed() {
statusBar()->showMessage("OK button pressed", 2000);
}
showMessage 方法在状态栏上显示消息。最后一个参数指定消息在状态栏上显示的毫秒数。
main.cpp
#include <QApplication>
#include "statusbar.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Statusbar window;
window.resize(300, 200);
window.setWindowTitle("QStatusBar");
window.show();
return app.exec();
}
相关推荐
- 【Docker 新手入门指南】第十章:Dockerfile
-
Dockerfile是Docker镜像构建的核心配置文件,通过预定义的指令集实现镜像的自动化构建。以下从核心概念、指令详解、最佳实践三方面展开说明,帮助你系统掌握Dockerfile的使用逻...
- Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译
-
前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...
- python虚拟环境迁移(python虚拟环境conda)
-
主机A的虚拟环境向主机B迁移。前提条件:主机A和主机B已经安装了virtualenv1.主机A操作如下虚拟环境目录:venv进入虚拟环境:sourcevenv/bin/active(1)记录虚拟环...
- Python爬虫进阶教程(二):线程、协程
-
简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...
- 基于网络安全的Docker逃逸(docker)
-
如何判断当前机器是否为Docker容器环境Metasploit中的checkcontainer模块、(判断是否为虚拟机,checkvm模块)搭配学习教程1.检查根目录下是否存在.dockerenv文...
- Python编程语言被纳入浙江高考,小学生都开始学了
-
今年9月份开始的新学期,浙江省三到九年级信息技术课将同步替换新教材。其中,新初二将新增Python编程课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材...
- CentOS 7下安装Python 3.10的完整过程
-
1.安装相应的编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-develope...
- 如何在Ubuntu 20.04上部署Odoo 14
-
Odoo是世界上最受欢迎的多合一商务软件。它提供了一系列业务应用程序,包括CRM,网站,电子商务,计费,会计,制造,仓库,项目管理,库存等等,所有这些都无缝集成在一起。Odoo可以通过几种不同的方式进...
- Ubuntu 系统安装 PyTorch 全流程指南
-
当前环境:Ubuntu22.04,显卡为GeForceRTX3080Ti1、下载显卡驱动驱动网站:https://www.nvidia.com/en-us/drivers/根据自己的显卡型号和...
- spark+python环境搭建(python 环境搭建)
-
最近项目需要用到spark大数据相关技术,周末有空spark环境搭起来...目标spark,python运行环境部署在linux服务器个人通过vscode开发通过远程python解释器执行代码准备...
- centos7.9安装最新python-3.11.1(centos安装python环境)
-
centos7.9安装最新python-3.11.1centos7.9默认安装的是python-2.7.5版本,安全扫描时会有很多漏洞,比如:Python命令注入漏洞(CVE-2015-2010...
- Linux系统下,五大步骤安装Python
-
一、下载Python包网上教程大多是通过官方地址进行下载Python的,但由于国内网络环境问题,会导致下载很慢,所以这里建议通过国内镜像进行下载例如:淘宝镜像http://npm.taobao.or...
- centos7上安装python3(centos7安装python3.7.2一键脚本)
-
centos7上默认安装的是python2,要使用python3则需要自行下载源码编译安装。1.安装依赖yum-ygroupinstall"Developmenttools"...
- 利用本地数据通过微调方式训练 本地DeepSeek-R1 蒸馏模型
-
网络上相应的教程基本都基于LLaMA-Factory进行,本文章主要顺着相应的教程一步步实现大模型的微调和训练。训练环境:可自行定义,mac、linux或者window之类的均可以,本文以ma...
- 【法器篇】天啦噜,库崩了没备份(天啦噜是什么意思?)
-
背景数据库没有做备份,一天突然由于断电或其他原因导致无法启动了,且设置了innodb_force_recovery=6都无法启动,里面的数据怎么才能恢复出来?本例采用解析建表语句+表空间传输的方式进行...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- skip-name-resolve (63)
- linuxlink (65)
- pythonwget (67)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)