QT基本控件的使用

一.Layouts

1.Vertical Layout

添加头文件

复制代码
#include <QHBoxLayout>

代码

复制代码
#include "centermain.h"
#include <QHBoxLayout>
#include <QLabel>

CenterMain::CenterMain(QWidget *parent)
    : QWidget{parent}
{
   // 子部件
    QLabel *cenTip1 = new QLabel("排序1",this);
    QLabel *cenTip2 = new QLabel("排序2",this);
    QLabel *cenTip3 = new QLabel("排序3",this);

    //创建垂直布局
    QVBoxLayout *vLayout = new QVBoxLayout(this);

    //调整布局属性
    vLayout ->setSpacing(15);//设置子部件间距为15像素
    vLayout ->setContentsMargins(20,20,20,20);//设置布局内边距(上下左右都是20)
    vLayout->setAlignment(Qt::AlignCenter);//子部件垂直居中

    //将子部件添加到垂直布局
    vLayout->addWidget(cenTip1);
    vLayout->addWidget(cenTip2);
    vLayout->addWidget(cenTip3);
}

效果

2.Horizontal Layout

添加头文件

复制代码
#include <QHBoxLayout>

代码

复制代码
#include "centermain.h"
#include <QHBoxLayout>
#include <QLabel>

CenterMain::CenterMain(QWidget *parent)
    : QWidget{parent}
{
   // 子部件
    QLabel *cenTip1 = new QLabel("排序1",this);
    QLabel *cenTip2 = new QLabel("排序2",this);
    QLabel *cenTip3 = new QLabel("排序3",this);
    //创建水平布局
    QHBoxLayout *hLayout = new QHBoxLayout(this);
    hLayout ->setSpacing(15);//设置子部件间距为15像素
    hLayout ->setContentsMargins(20,20,20,20);//设置布局内边距(上下左右都是20)
    hLayout->setAlignment(Qt::AlignCenter);//子部件垂直居中

    //将子部件添加到垂直布局
    hLayout->addWidget(cenTip1);
    hLayout->addWidget(cenTip2);
    hLayout->addWidget(cenTip3);

}

效果

3.Grid Layout

添加头文件

复制代码
#include <QGridLayout>

代码

复制代码
#include "centermain.h"
#include <QGridLayout>
#include <QLabel>


CenterMain::CenterMain(QWidget *parent)
    : QWidget{parent}
{
   // 子部件
    QLabel *cenTip1 = new QLabel("排序1",this);
    QLabel *cenTip2 = new QLabel("排序2",this);
    QLabel *cenTip3 = new QLabel("排序3",this);
    //创建网格布局
    QGridLayout *gridLayout = new QGridLayout(this);

    gridLayout->setHorizontalSpacing(10);//列间距为10
    gridLayout->setVerticalSpacing(15);//行间距15
    gridLayout->setContentsMargins(30,30,30,30);//布局内间距 上下左右30
    gridLayout->setAlignment(Qt::AlignCenter);

    //添加子部件到布局
    gridLayout->addWidget(cenTip1,0,0);
    gridLayout->addWidget(cenTip2,0,1);
    gridLayout->addWidget(cenTip3,1,0);

}

效果

4.Form Layout

添加头文件

复制代码
#include <QFormLayout>

代码

复制代码
   //输入框
    QLineEdit *leName = new QLineEdit();
    QLineEdit *lePhone = new QLineEdit();

    //表单布局
    QFormLayout *formLayout = new QFormLayout(this);

    formLayout->addRow("姓名: ",leName);
    formLayout->addRow("电话: ",lePhone);

效果

二. Buttons

1.Push Button

添加头文件

复制代码
#include <QPushButton>

代码

复制代码
 // 1. 设置/获取按钮文本
    QPushButton *btn = new QPushButton(this);
    btn->setText("按钮文本"); // 设置文本
    QString text = btn->text(); // 获取当前文本

    // 2. 设置按钮大小(三种方式)
    btn->setFixedSize(200, 40); // 固定宽高(不可拉伸)
    btn->setFixedWidth(200); // 仅固定宽度
    btn->setFixedHeight(40); // 仅固定高度
    btn->resize(200, 40); // 设置初始大小(可跟随布局拉伸)

    btn->move(200,200);

    // 3. 鼠标悬浮提示
    btn->setToolTip("这是一个按钮");
    // 4. 启用/禁用按钮
    btn->setEnabled(true); // 启用(默认,可点击)

    // 5. 设置按钮扁平样式(无默认背景边框)
    btn->setFlat(true);

    // 常用信号绑定示例
    // 1. clicked信号(最常用,点击释放后触发,带是否被选中参数)
    QObject::connect(btn, &QPushButton::clicked, [=](bool checked) {
        qDebug() << "123" << checked;
    });

    // 2. pressed信号(按钮被按下时触发,未释放)
    QObject::connect(btn, &QPushButton::pressed, []() {
        qDebug() << "456";
    });

    // 3. released信号(按钮被释放时触发,无论是否在按钮内释放)
    QObject::connect(btn, &QPushButton::released, []() {
        qDebug() << "789";
    });

效果

2.Tool Button

添加头文件

复制代码
#include <QToolButton>

代码

复制代码
 //创建按钮
    QToolButton *toolButton = new QToolButton(this);

    toolButton->setIcon(QIcon(":/OIP-C.jpg"));
    toolButton->setText("设置按钮"); // 设置配套文本
    toolButton->setFixedSize(120, 48);
    toolButton->setToolTip("图标+文本工具按钮");
    // 设置工具按钮样式:图标在上,文本在下(多种样式可选)
    toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

    // 绑定类型1:仅图标按钮的点击信号(与QPushButton类似)
    QObject::connect(toolButton, &QToolButton::clicked, [=]() {
        QMessageBox::information(this, "提示", "工具按钮被点击!", QMessageBox::Ok);
    });

效果

3.Radio Button

添加头文件

复制代码
#include <QRadioButton>

代码

复制代码
    QRadioButton *rbMale = new QRadioButton("男",this);
    rbMale->move(200,400);
    QRadioButton *rbFemale = new QRadioButton("女",this);
    rbFemale->move(300,400);

    // 方式1:单个按钮绑定(适合需要单独处理的场景)
    QObject::connect(rbMale, &QRadioButton::toggled, [=](bool checked) {
        if (checked) { // 仅当选中时触发(取消选中时不处理)
            qDebug() << "man";
        }
    });

效果

4.Check Box

添加头文件

复制代码
#include <QCheckBox>

代码

复制代码
    QCheckBox *cbMusic = new QCheckBox("音乐",this);
    cbMusic->move(200,200);
    QCheckBox *cbReadubg = new QCheckBox("阅读",this);
    cbReadubg->move(200,300);
    QCheckBox *cbSports = new QCheckBox("运动",this);
    cbSports->move(200,400);

    QObject::connect(cbMusic, &QCheckBox::toggled, [=](bool checked) {
        if (checked) { // 仅当选中时触发(取消选中时不处理)
            qDebug() << "man";
        }
    });

效果

添加头文件

复制代码
#include <QCommandLinkButton>

代码

复制代码
    QCommandLinkButton *btnGuide = new QCommandLinkButton(this);
    //设置主文本
    btnGuide ->setText("设置系统参数");
    //设置辅助文本
    btnGuide->setDescription("点击后进入系统配置界面");

    connect(btnGuide,&QCommandLinkButton::clicked,[=](){
        QMessageBox::information(this,"反馈","进入系统配置页面",QMessageBox::Ok);
    });

效果

6.Dialog Button Box

添加头文件

复制代码
#include<QDialogButtonBox>

代码

复制代码
//创建对话框
    QDialog * dlg = new QDialog(this);
    dlg->setWindowTitle("基础对话框");
    dlg->resize(350,200);

    //创建按钮
    QDialogButtonBox *btnBox = new QDialogButtonBox(
        QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
        Qt::Horizontal,
        this
        );

    // 4. 绑定标准按钮的信号(无需单独绑定每个按钮,QDialogButtonBox 提供统一信号)
    // accepted 信号:点击 OK/Yes/Apply 等确认类按钮时触发
    QObject::connect(btnBox, &QDialogButtonBox::accepted, [&]() {
        QMessageBox::information(this, "提示", "保存成功!", QMessageBox::Ok);
       // dlg.accept(); // 关闭对话框,返回 QDialog::Accepted 结果
    });

    // rejected 信号:点击 Cancel/No/Close 等取消类按钮时触发
    QObject::connect(btnBox, &QDialogButtonBox::rejected, [&]() {
        QMessageBox::information(this, "提示", "已取消保存", QMessageBox::Ok);
       // dlg.reject(); // 关闭对话框,返回 QDialog::Rejected 结果
    });

效果

三.Item View

1.List View

添加头文件

复制代码
#include<QListView>

代码

复制代码
 this->setWindowTitle("QListView 基础纯文本列表");
    this->resize(400, 300);
    QVBoxLayout *vLayout = new QVBoxLayout(this);
    vLayout->setContentsMargins(20, 20, 20, 20);

    //1.创建模型
    QStringListModel *strModel = new QStringListModel(this);
    QStringList dataList = {"苹果","香蕉","橙子","葡萄","芒果"};
    strModel->setStringList(dataList);

    //2.创建ListView
    QListView *listView = new QListView(this);
    listView->setModel(strModel);

    vLayout->addWidget(listView);

    //绑定信号
    connect(listView,&QListView::doubleClicked,[=](const QModelIndex &index){
        // index:模型中数据的唯一索引,通过index获取对应数据
        QString text = strModel->data(index, Qt::DisplayRole).toString();
        QMessageBox::information(this, "提示", text, QMessageBox::Ok);
    });

效果

2.Tree View

添加头文件

复制代码
#include<QTreeView>

代码

复制代码
  //1.创建树形模型
    QStandardItemModel *treeModel = new QStandardItemModel(this);
    //设置树形表头
    treeModel->setHorizontalHeaderLabels({"商品分类目录"});
    //构建多级节点
    //一级节点
    QStandardItem *itemElectronics = new QStandardItem("电子产品");
    //二级节点
    QStandardItem *itemPhon = new QStandardItem("手机");
    QStandardItem *itemCompiter = new QStandardItem("电脑");
    itemElectronics->appendRows({itemPhon,itemCompiter});
    //三级目录
    QStandardItem *itemIPhone = new QStandardItem("苹果手机");
    QStandardItem *itemII = new QStandardItem("I手机");
    itemPhon->appendRows({itemIPhone,itemII});

    //添加数据
    treeModel->appendRow({itemElectronics});

    //创建QTreeView
    QTreeView *treeView = new QTreeView(this);
    treeView->setModel(treeModel);

效果

3.Table View

添加头文件

复制代码
#include <QTableView>

代码

复制代码
  //创建表格模型
    QStandardItemModel *tableModel = new QStandardItemModel(this);
    //设置行列数
    int rowCount = 4;
    int colCount = 3;
    tableModel->setRowCount(rowCount);
    tableModel->setColumnCount(colCount);

    //设置表头
    tableModel->setHorizontalHeaderLabels({"姓名","科目","成绩"});
    tableModel->setVerticalHeaderLabels({"第一条","第二条","第三条","第四条"});

    //填充数据
    QList<QList<QString>> tableData={
        {"张","数学","95"},
        {"李","数学","96"},
        {"王","数学","97"},
        {"阿","数学","98"}
        };
    for(int row =0; row<rowCount;row++){
        for(int col =0;col<colCount;col++){
            QStandardItem *item = new QStandardItem(tableData[row][col]);
            tableModel->setItem(row,col,item);
        }
    }
    //创建QTableView模型
    QTableView *tableView = new QTableView(this);
    tableView->setModel(tableModel);

效果

4.Column View

添加头文件

复制代码
#include<QColumnView>

代码

复制代码
// 1. 创建层级模型(与QTreeView完全一致,复用层级构建逻辑)
    QStandardItemModel *colModel = new QStandardItemModel(this);
    QStandardItem *rootItem = colModel->invisibleRootItem();

    // 构建多级分类数据(一级:电子产品/生活用品 → 二级:子分类 → 三级:具体商品)
    QStandardItem *itemElectronics = new QStandardItem("电子产品");
    QStandardItem *itemPhone = new QStandardItem("手机");
    QStandardItem *itemComputer = new QStandardItem("电脑");
    itemElectronics->appendRows({itemPhone, itemComputer});

    QStandardItem *itemIphone = new QStandardItem("苹果手机");
    QStandardItem *itemHuawei = new QStandardItem("I手机");
    itemPhone->appendRows({itemIphone, itemHuawei});

    QStandardItem *itemDaily = new QStandardItem("生活用品");
    QStandardItem *itemKitchen = new QStandardItem("厨具");
    QStandardItem *itemClothes = new QStandardItem("服饰");
    itemDaily->appendRows({itemKitchen, itemClothes});

    rootItem->appendRows({itemElectronics, itemDaily});

    //创建QColumnView
    QColumnView *columnV = new QColumnView(this);
    columnV->setModel(colModel);



    vLayout->addWidget(columnV);

效果

5.Undo View

可视化展示撤销历史记录

四.Containers

1.Group Box

添加头文件

复制代码
#include<QGroupBox>

代码

复制代码
// ========== 1. 创建QGroupBox实例 + 基础常用设置 ==========
    QGroupBox * m_groupBox = new QGroupBox(this);
    m_groupBox->setTitle("用户信息配置(常用设置演示)"); // 设置标题
    m_groupBox->setAlignment(Qt::AlignHCenter); // 标题水平居中
    m_groupBox->setFlat(false); // 显示边框(默认false,true隐藏边框)
    m_groupBox->setCheckable(true); // 启用折叠功能(标题前显示复选框)
    m_groupBox->setChecked(true); // 默认展开状态
    m_groupBox->setMinimumWidth(350); // 最小宽度,防止压缩
    m_groupBox->setMinimumHeight(220); // 最小高度
    m_groupBox->setEnabled(true); // 启用分组框(false整体灰化)
    // 样式表美化(常用:标题字体、边框颜色、内边距)
    m_groupBox->setStyleSheet(
        "QGroupBox { "
        "   font-size: 14px; "
        "   font-weight: bold; "
        "   color: #1f3a8a; "
        "   border: 2px solid #c3dafe; "
        "   border-radius: 8px; "
        "} "
        "QGroupBox::title { "
        "   subcontrol-origin: margin; "
        "   left: 20px; "
        "   padding: 0 10px 0 10px; "
        "   color: #1e40af; "
        "} "
        "QGroupBox:checked { "
        "   border-color: #60a5fa; "
        "} "
        );

效果

2.Scroll Area

添加头文件

复制代码
#include<QScrollArea>

代码

复制代码
  // ========== 1. 创建 QScrollArea 实例 + 所有常用设置 ==========
   QScrollArea *m_scrollArea = new QScrollArea(this);
    // 基础属性:设置窗口标题(仅作标识,可选)
    // 滚动条策略(核心常用设置)
    m_scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); // 水平滚动条:按需显示(内容超出时才出现)
    m_scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);   // 垂直滚动条:始终显示(方便演示,也可设为AsNeeded)
    // 核心设置:允许滚动窗口(m_scrollWidget)随滚动区域调整大小
    m_scrollArea->setWidgetResizable(true);
    // 尺寸设置:防止滚动区域被压缩变形
    m_scrollArea->setMinimumWidth(400);
    m_scrollArea->setMinimumHeight(300);
    // 外观设置:是否显示边框(默认true,显示原生边框)
    m_scrollArea->setFrameShape(QFrame::StyledPanel); // 边框样式:StyledPanel(原生风格)
    m_scrollArea->setFrameShadow(QFrame::Sunken);     // 边框阴影:凹陷风格
    // 美化样式表(常用:滚动条样式、滚动区域边框、背景色)
    m_scrollArea->setStyleSheet(
        "QScrollArea { "
        "   border: 2px solid #e2e8f0; "
        "   border-radius: 8px; "
        "   background-color: #f8fafc; "
        "} "
        "QScrollBar:vertical { "
        "   background-color: #f1f5f9; "
        "   width: 12px; "
        "   margin: 0px 0px 0px 0px; "
        "} "
        "QScrollBar::handle:vertical { "
        "   background-color: #94a3b8; "
        "   border-radius: 6px; "
        "   min-height: 20px; "
        "} "
        "QScrollBar::handle:vertical:hover { "
        "   background-color: #64748b; "
        "} "
        "QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { "
        "   height: 0px; "
        "} "
        );

效果

3.Tool Box

添加头文件

复制代码
#include<QToolBox>

代码

复制代码
  // ========== 1. 创建QToolBox实例 + 核心常用设置 ==========
   QToolBox* m_toolBox = new QToolBox(this);
    // 基础尺寸设置:防止工具盒被压缩变形
    m_toolBox->setMinimumWidth(400);
    m_toolBox->setMinimumHeight(350);
    // 核心页面设置
    m_toolBox->setCurrentIndex(0); // 设置默认选中第0页(索引从0开始)
   // m_toolBox->setAlignment(Qt::AlignHCenter); // 标签文本水平居中(默认左对齐)
   // m_toolBox->setMaxVisibleItems(3); // 最大可见标签数(超出显示滚动条)
    m_toolBox->setFrameShape(QFrame::StyledPanel); // 边框样式:原生风格
    m_toolBox->setFrameShadow(QFrame::Sunken);     // 边框阴影:凹陷风格
    // 启用/禁用指定页面(示例:禁用第2页,后续可手动启用)
    // m_toolBox->setItemEnabled(2, false);
    // 美化样式表(常用:标签样式、选中页面、边框、滚动条)
    m_toolBox->setStyleSheet(
        "QToolBox { "
        "   border: 2px solid #e2e8f0; "
        "   border-radius: 8px; "
        "   background-color: #f8fafc; "
        "} "
        "QToolBox::tab { "
        "   font-size: 13px; "
        "   font-weight: 500; "
        "   color: #475569; "
        "   background-color: #f1f5f9; "
        "   padding: 8px 15px; "
        "   margin: 2px 0; "
        "   border-radius: 4px; "
        "} "
        "QToolBox::tab:selected { "
        "   color: #1e40af; "
        "   background-color: #c3dafe; "
        "   border-left: 3px solid #3b82f6; "
        "} "
        "QToolBox QScrollBar:vertical { "
        "   background-color: #f1f5f9; "
        "   width: 10px; "
        "} "
        "QToolBox QScrollBar::handle:vertical { "
        "   background-color: #94a3b8; "
        "   border-radius: 5px; "
        "} "
        );

效果

五.控件一句话总结

1、容器控件(Container Widgets)

用于承载、分组其他控件,管理界面布局:

  • Group Box:将相关控件分组(比如 "用户信息" 组),支持折叠 / 展开,带标题和边框。
  • Scroll Area:当内容超出可视区域时,自动添加滚动条,可滚动查看全部内容。
  • Tool Box:折叠式面板(类似 "手风琴"),多个页面仅展开一个,节省界面空间。
  • Tab Widget:标签页控件(比如 "首页 / 设置 / 关于"),点击标签切换不同页面内容。
  • Stacked Widget:堆叠式页面(无标签),需手动通过按钮等切换页面(比 Tab Widget 更灵活)。
  • Frame:轻量容器,用于简单分组 / 加边框(功能比 Group Box 基础)。
  • Widget:最基础的容器控件,可承载任意子控件 / 布局,也作为其他控件的父对象。
  • MDI Area:多文档界面容器,支持在一个窗口内打开多个子窗口(类似 Office 的多文档编辑)。
  • Dock Widget:可浮动 / 停靠的窗口(比如软件侧边栏),支持拖拽、停靠到主窗口边缘。
  • QAxWidget:用于嵌入 ActiveX 控件(比如在 Qt 中加载 Office 组件)。

2、输入控件(Input Widgets)

用于接收用户输入:

  • Combo Box:下拉选择框,提供预设选项供用户选择。
  • Font Combo Box:专用下拉框,仅用于选择字体。
  • Line Edit:单行文本输入框(比如输入用户名、密码)。
  • Text Edit:多行富文本输入框(支持格式,比如加粗、换行)。
  • Plain Text Edit:多行纯文本输入框(无格式,比如写代码、日志)。
  • Spin Box:整数数字输入框(支持上下箭头调整数值)。
  • Double Spin Box:小数数字输入框(支持更高精度的数值调整)。
  • Time Edit:时间输入控件(选择小时 / 分钟)。
  • Date Edit:日期输入控件(选择年 / 月 / 日)。
  • Date/Time Edit:日期 + 时间组合输入控件。
  • Dial:表盘式旋钮控件(通过旋转调整数值,类似收音机调台)。
  • Horizontal/Vertical Scroll Bar:水平 / 垂直滚动条(手动拖拽控制内容滚动)。
  • Horizontal/Vertical Slider:水平 / 垂直滑块(拖拽调整数值,比如音量条)。
  • Key Sequence Edit:快捷键输入控件(比如设置 "Ctrl+C" 这类操作)。

3.显示类控件(Display Widgets)

  • **Label:**最基础的显示控件,用于展示文本、图片或图标,常作为界面的提示信息载体(如 "用户名:" 这类提示)。

  • **Text Browser:**富文本展示控件,支持显示带格式的文本、超链接,还能加载本地 / 网络文档,相当于简易的内置浏览器。

  • **Graphics View:**复杂图形展示容器,用于呈现 2D 图形、动画、大量自定义元素,支持缩放、平移等交互操作(适合复杂可视化场景)。

  • **Calendar Widget:**日历展示与选择控件,提供日期可视化界面,支持用户选择具体日期(兼具显示与基础交互功能)。

  • **LCD Number:**模拟 LCD 数字的显示控件,常用于展示数值(如计时器、计数器、设备状态数值),自带电子屏风格的视觉效果。

  • **Progress Bar:**进度展示控件,用于呈现任务的完成进度(如下载进度、加载进度),支持设置进度值与状态提示。

  • **Horizontal/Vertical Line:**界面分隔控件,通过水平 / 垂直线条划分界面区域,提升布局的层次感与区分度。

  • **OpenGL Widget:**集成 OpenGL 渲染的控件,用于展示高性能的 3D 图形、复杂渲染效果(适合图形密集型场景)。

  • **QQuickWidget:**用于在 Qt Widgets 界面中嵌入 Qt Quick(QML)界面,可实现更灵活、丰富的 UI 交互效果。

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript