Qt实现 自定义矩阵布局

Qt C++ 实现翻金币游戏:从逻辑建模到动画优化的完整开发指南 图形界面编程是桌面应用开发的基础,其核心在于通过事件驱动模型实现用户交互与状态同步。Qt框架以其强大的信号与槽机制和跨平台能力,成为构建此类应用的理想选择。在游戏开发中,状态机设计与界面渲染的协同至关重要,它能有效提升代码的可维护性与用户体验。翻金币游戏作为一个经典案例,完美融合了二维数组建模、Qt Widgets组件应用及自定义动画实现。通过封装GameBoard类管理游戏逻辑,并利用QPropertyAnimation为按钮添加翻转效果,开发者不仅能深入理解面向对象设计,还能掌握资源管理、布局优化等工程 阅读详情

前言:

当界面需要同时展示多个项的时候,可能需要一个矩阵来填充数据,因为通常不知道数据项的多少,所以支持自定义行列就显得尤为重要,

比如可能需要在一台电脑同时显示多个报表的数据,如果一直切换,因为无法比较各个报表的数据,难免不够直观,这种时候,通过矩阵布局同步显示一般是首选方案。

效果展示:

本次采用的技术是qt,思路是通过在矩阵上布局对应的控件,以搭载数据的显示,这样子数据就可以放到对应的承载控件上显示。

通过行列号的设置来随时切换布局效果,矩阵同时支持随主界面大小的改变而改变,以适应不同的场景需求。

主要实现代码:

void MatrixLayoutWidget::onSetMatrixLayout(int row, int column, bool bIsResize)
{
    QSize size = _displayWall->size();
    int num = row*column;
    if (num == 0)
    {
        num = 1;
        row = 1;
        column = 1;
    }
    _row = row;
    _column = column;

    int labelSpace = 5;
    int labelWidth = size.width() / column;
    int labelHeigt = size.height() / row;

    if (!bIsResize)
        removeLabel();

    for (int i = 0; i < num; i++)
    {
        if (!bIsResize)
        {
            QLabel *label = new QLabel(this);
            label->setAlignment(Qt::AlignCenter);
            label->setStyleSheet("background-color:rgb(243,243,147)");
            label->resize(labelWidth - labelSpace, labelHeigt - labelSpace);
            _labelMap[i] = label;	//注册

        }
        else
        {
            QLabel *label = nullptr;
            auto iter = _labelMap.begin();
            for (; iter != _labelMap.end(); iter++)
            {
                label = iter.value();
                label->resize(labelWidth - labelSpace, labelHeigt - labelSpace);
            }
        }
    }

    for (int j = 0; j < column; j++)
    {
        for (int k = 0; k < row; k++)
        {
            int index = (row*j + k);
            QLabel *label = _labelMap[index];
            label->hide();
            label->move(labelWidth * j, labelHeigt * k+30);
            label->show();
        }
    }
    _displayWall->update();
}

以上采用QMap来注册管理对应的承载控件,因为后续需要对控件上的子控件进行操作,所以保存了一个索引,以表示鼠标点击的是哪个承载控件。

通过这个思路,可以拓展很多功能,比如在对应承载控件双击,弹出详细的报表数据,鼠标右键弹出菜单,对控件上展示的报表数据进行其他操作等。

每次扩大行列布局的时候,目前采用先去除之前的控件,再创建新的,不过对于非实时获取数据并展示的需求而已不是很友好,因为用户可能只想增加两个新的报表,却把之前的数据清除掉了,

所以根据业务的需求,如果增加了数据,可以在原先的map表基础上再注册新的label,然后重新遍历即可。

void MatrixLayoutWidget::removeLabel()
{
    //清除
    auto iter = _labelMap.begin();
    for (; iter != _labelMap.end(); iter++)
    {
        if (iter.value()) {
            delete iter.value();
            iter.value() = nullptr;
        }
    }
    _labelMap.clear();
}

void MatrixLayoutWidget::resizeEvent(QResizeEvent *event)
{
    //重新计算QLable的大小
    if (_labelMap.count() > 0) {
        onSetMatrixLayout(_row, _column, true);
    }
}

通过重写resizeEvent事件来实现矩阵上的控件随窗口的大小变化而变化。只有画布上有矩阵的时候,才去做处理,避免不必要的麻烦。

整个代码demo逻辑很简单,因为可扩展性比较强,后期准备增加点新的功能,同步到github上,比如可以在每个矩阵的label上都显示波形,或者视频,或者图表。

以下是所有代码:

//.h
#ifndef MATRIXLAYOUTWIDGET_H
#define MATRIXLAYOUTWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QMap>

class MatrixLayoutWidget : public QWidget
{
    Q_OBJECT

public:
    MatrixLayoutWidget(QWidget *parent = nullptr);
    ~MatrixLayoutWidget();

private:
    void removeLabel();
    virtual void resizeEvent(QResizeEvent *event) override;

protected slots:
    void onSetMatrixLayout(int row, int column, bool bIsResize=false);
    void onMatrixLayoutDivision();

private:
    QPushButton		*_1x1Btn;
    QPushButton		*_2x2Btn;
    QPushButton		*_3x3Btn;
    QPushButton		*_editBtn;
    QLineEdit		*_rowEdit;
    QLineEdit		*_columnEdit;
    QFrame *_displayWall;
    QMap<quint16, QLabel *> _labelMap;
    int _row;		//行
    int _column;	//列
};
#endif // MATRIXLAYOUTWIDGET_H



//cpp
#include "matrixlayoutwidget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>

MatrixLayoutWidget::MatrixLayoutWidget(QWidget *parent)
    : QWidget(parent)
{
    int controlW = 180;
    int controlH = 25;

    _1x1Btn = new QPushButton;
    _2x2Btn = new QPushButton;
    _3x3Btn = new QPushButton;
    _rowEdit = new QLineEdit;
    _columnEdit = new QLineEdit;
    _editBtn = new QPushButton;

    _1x1Btn->setObjectName("btn");
    _2x2Btn->setObjectName("btn");
    _3x3Btn->setObjectName("btn");
    _editBtn->setObjectName("btn");

    _1x1Btn->setFixedSize(controlW / 3, controlH);
    _1x1Btn->setText("1X1");
    _2x2Btn->setFixedSize(controlW/3, controlH);
    _2x2Btn->setText("2X2");
    _3x3Btn->setFixedSize(controlW / 3, controlH);
    _3x3Btn->setText("3X3");
    _rowEdit->setFixedSize(controlW / 2, controlH);
    _columnEdit->setFixedSize(controlW / 2, controlH);
    _editBtn->setFixedSize(controlW / 3, controlH);
    _editBtn->setText("Custom");
    //
    QHBoxLayout *editLayout = new QHBoxLayout;
    editLayout->setMargin(0);
    editLayout->setSpacing(0);
    editLayout->addWidget(new QLabel("Row:"));
    editLayout->addWidget(_rowEdit);
    editLayout->addWidget(new QLabel("X"));
    editLayout->addWidget(new QLabel("Column:"));
    editLayout->addWidget(_columnEdit);
    editLayout->addWidget(_editBtn);

    //
    QHBoxLayout *hlayout = new QHBoxLayout;
    hlayout->setMargin(0);
    hlayout->setSpacing(10);
    hlayout->addWidget(_1x1Btn);
    hlayout->addWidget(_2x2Btn);
    hlayout->addWidget(_3x3Btn);
    hlayout->addLayout(editLayout);

    _displayWall = new QFrame;
    _displayWall->setStyleSheet("background-color:rgb(122,125,118)");
    _displayWall->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    QVBoxLayout *vhlayout = new QVBoxLayout;
    vhlayout->setMargin(0);
    vhlayout->setSpacing(5);
    vhlayout->addLayout(hlayout);
    vhlayout->addWidget(_displayWall);

    connect(_1x1Btn, SIGNAL(clicked()), this, SLOT(onMatrixLayoutDivision()));
    connect(_2x2Btn, SIGNAL(clicked()), this, SLOT(onMatrixLayoutDivision()));
    connect(_3x3Btn, SIGNAL(clicked()), this, SLOT(onMatrixLayoutDivision()));
    connect(_editBtn, SIGNAL(clicked()), this, SLOT(onMatrixLayoutDivision()));

    this->setLayout(vhlayout);
    this->setMinimumSize(400,300);
    onSetMatrixLayout(1, 1);
}

MatrixLayoutWidget::~MatrixLayoutWidget()
{
    removeLabel();
}


void MatrixLayoutWidget::onSetMatrixLayout(int row, int column, bool bIsResize)
{
    QSize size = _displayWall->size();
    int num = row*column;
    if (num == 0)
    {
        num = 1;
        row = 1;
        column = 1;
    }
    _row = row;
    _column = column;

    int labelSpace = 5;
    int labelWidth = size.width() / column;
    int labelHeigt = size.height() / row;

    if (!bIsResize)
        removeLabel();

    for (int i = 0; i < num; i++)
    {
        if (!bIsResize)
        {
            QLabel *label = new QLabel(this);
            label->setAlignment(Qt::AlignCenter);
            label->setStyleSheet("background-color:rgb(243,243,147)");
            label->resize(labelWidth - labelSpace, labelHeigt - labelSpace);
            _labelMap[i] = label;	//注册

        }
        else
        {
            QLabel *label = nullptr;
            auto iter = _labelMap.begin();
            for (; iter != _labelMap.end(); iter++)
            {
                label = iter.value();
                label->resize(labelWidth - labelSpace, labelHeigt - labelSpace);
            }
        }
    }

    for (int j = 0; j < column; j++)
    {
        for (int k = 0; k < row; k++)
        {
            int index = (k + row*j);
            QLabel *label = _labelMap[index];
            label->hide();
            label->move(labelWidth * j, labelHeigt * k+30);
            label->show();
        }
    }
    _displayWall->update();
}

void MatrixLayoutWidget::onMatrixLayoutDivision()
{
    if (sender() == _1x1Btn)
    {
        _row = 1;
        _column = 1;
    }
    else if (sender() == _2x2Btn)
    {
        _row = 2;
        _column = 2;
    }
    else if (sender() == _3x3Btn)
    {
        _row = 3;
        _column = 3;
    }
    else if (sender() == _editBtn)
    {
        _row = _rowEdit->text().toInt();
        _column = _columnEdit->text().toInt();
        if (_row == 0 || _column == 0) {
            QMessageBox::critical(this, tr("warn"), "Row or Column Is Zero",                 QMessageBox::Ok);
            return;
        }
    }

    onSetMatrixLayout(_row, _column, false);
}


void MatrixLayoutWidget::removeLabel()
{
    //清除
    auto iter = _labelMap.begin();
    for (; iter != _labelMap.end(); iter++)
    {
        if (iter.value()) {
            delete iter.value();
            iter.value() = nullptr;
        }
    }
    _labelMap.clear();
}

void MatrixLayoutWidget::resizeEvent(QResizeEvent *event)
{
    //重新计算QLable的大小
    if (_labelMap.count() > 0) {
        onSetMatrixLayout(_row, _column, true);
    }
}

界面采用代码绘制,比起qt设计师拖拽而已,比较方便调整,因为设计师一打破布局,再调整就很麻烦,而且也不方便复用,所以个人感觉还是代码绘制比较舒服。

Qt布局二选一:用QListView做流式布局真的比自定义FlowLayout好吗? 本文深入探讨了Qt开发中流式布局的两种实现方案:QListView与自定义FlowLayout。通过架构差异、性能对比和实战案例,分析了QListView在模型/视图架构下的优势与自定义FlowLayout在精确控制方面的灵活性,为开发者提供了清晰的决策框架和优化技巧。 阅读详情

相关推荐

C++与Qt5矩阵运算系统:从核心算法到GUI开发实战

矩阵运算作为线性代数的核心概念,是科学计算与工程应用的基础。其原理在于通过行列式、向量空间等数学结构,对数据进行高效组织与变换。在技术价值上,矩阵运算为机器学习、图形处理、仿真模拟等关键领域提供了底层支持。应用场景广泛,从数据分析到控制系统设计均离不开矩阵操作。本文聚焦于如何利用C++的面向对象特性和STL容器实现健壮的矩阵类,并结合Qt5框架构建直观的图形用户界面,通过运算符重载、异常处理等工程实践,打造一个完整的桌面应用,涵盖从数据结构设计到界面交互的全流程。

daxi1047的博客 453

使用Qt 中的QTableWidget控件在Qt中实现输入任意大小的矩阵

使用Qt 中的QTableWidget控件在Qt中实现输入任意大小的矩阵

DongZhaoCheng 1560

解决Qt界面布局难题:addWidget参数全解析(含常见错误排查)

本文深入解析Qt界面开发中`addWidget`方法的核心参数,包括stretch伸缩因子和对齐标志位的使用技巧,帮助开发者解决常见的布局问题如部件重叠、伸缩比例失控等。通过典型错误案例和解决方案,提升Qt布局管理的实战能力。

weixin_42535461的博客 426

Qt实现自定义矩阵布局

Qt实现自定义矩阵布局

m0_73443478的博客 688

实现Qt下的Windows风格文件预览布局

Qt是一个跨平台的应用程序和用户界面框架,广泛应用于开发图形界面(GUI)程序。它使用C++编写,同时也提供了一种名为QML的声明式脚本语言用于设计用户界面。流式布局是图形用户界面(GUI)开发中常用的布局管理方式之一,它的设计目标是让界面元素按照添加的顺序从左至右、从上到下依次排列,当一个行空间填满后,元素会自动换行到下一行。这种布局方式在元素数量不确定、或者元素宽度不固定的情况下尤其有用。布局管理器(Layout Manager)是负责管理界面中控件位置和大小的组件。

weixin_32456485的博客 953

基于QPainter的Qt自定义SwitchButton开关按钮实现

在现代GUI开发中,我们常常面临一个尴尬的现实——设计师给的UI稿越来越炫酷,而标准控件却越来越跟不上节奏 😅。还记得第一次看到iOS风格的滑动开关时那种惊艳感吗?但当你打开Qt文档想找个现成的时……结果发现只有朴实无华的QCheckBox,是不是瞬间有种”理想很丰满,现实很骨感”的感觉?别担心!这正是今天我们要深入探讨的话题。我们将一起揭开Qt强大绘图系统的神秘面纱,手把手打造一个媲美原生应用体验的工业级开关控件。准备好了吗?让我们开始这段奇妙的技术之旅吧 🚀!

weixin_32102617的博客 413

简单的矩阵控件-Matrix

很多文章,不知道怎么开头,就搁置下来了,以至于现在脑中有了好几篇文章的构思,却还是在脑海中的阶段。。。 仿佛下手是件很难的事情。所以今天干脆以这个做为开头了。 好了,接下来要说回正事了。 先看下效果图: 1、我们要实现一个m * n(m和n可相等)的矩阵,同时在Qt的帮助文档里面,我们发现已经有了mxn(m <= 4, n <= 4)的矩阵,但并没有提供相应的界面显示的控件。因此,我们使用QDoubleSpinBox来实现一个m*n矩阵的界面显示控件。 首先我们来看一下类的定义。 class

slowlytalk 796

使用Qt显示openCV矩阵图片

在Qt界面中显示opencv图像 简单的Demo 使用的qt5.02版本 opencv2.43版本

Qt实现简单项目——矩阵生成

一、说明 二、实例图片 三、操作步骤 一、说明 通过输入行数、列数,在规定范围内生成按钮,组成矩阵,并且可以通过按钮做全选、多选操作,将选中的按钮变色。 二、实例图片 三、操作步骤 1、文件创建 (1)创建工程文件,选择MainWindow类型,并勾选Generate form,生成UI界面图; (2)创建如图所示界面,用到的控件有Group Box、Line Edit、Push Button、Radio Button、Spin Box及Label,根据个人习惯对齐进...

DXuexue的博客 4202

C++ QT 矩阵运算器

C++ QT 矩阵运算器。 使用QT、C++开发的矩阵运算器,支持加减乘和转置(对左边矩阵进行转置),底层数据结构使用的是稀疏矩阵,用数组实现。 C++、QT

基于QT开发的人机交互界面,操作系统课程设计.zip

模拟操作系统,具有进程管理,内存管理,磁盘管理,文件系统,设备管理五个功能模块 管理系统是一种通过计算机技术实现的用于组织、监控和控制各种活动的软件系统。这些系统通常被设计用来提高效率、减少错误、加强安全性,同时提供数据和信息支持。以下是一些常见类型的管理系统: 学校管理系统: 用于学校或教育机构的学生信息、教职员工信息、课程管理、成绩记录、考勤管理等。学校管理系统帮助提高学校的组织效率和信息管理水平。 人力资源管理系统(HRM): 用于处理组织内的人事信息,包括员工招聘、培训记录、薪资管理、绩效评估等。HRM系统有助于企业更有效地管理人力资源,提高员工的工作效率和满意度。 库存管理系统: 用于追踪和管理商品或原材料的库存。这种系统可以帮助企业避免库存过剩或不足的问题,提高供应链的效率。 客户关系管理系统(CRM): 用于管理与客户之间的关系,包括客户信息、沟通记录、销售机会跟踪等。CRM系统有助于企业更好地理解客户需求,提高客户满意度和保留率。 医院管理系统: 用于管理医院或医疗机构的患者信息、医生排班、药品库存等。这种系统可以提高医疗服务的质量和效率。 财务管理系统: 用于记录和管理组织的财务信息,包括会计凭证、财务报表、预算管理等。财务管理系统

Qt 实现动态矩阵界面

在某些场合,需要呈现多个图表或者界面,但是图表的个数是不固定的。 就可以先生成一定数量的父对象,来承接图表。同时在界面预览不够时增加滚动条效果。 核心思路:利用Qt布局的QGridLayout-栅格布局与QScrollArea结合 效果如下: demo核心代码: for(int i=0;i<200;i++) { LabelModel *label = new LabelModel(this); label->setMinimumSize(100,200); connect(l

c_shell_python的博客 1394

UE5.1实战:从零到打包,手把手教你用UMG和蓝图搭建智慧城市数字孪生界面

本文详细介绍了如何使用UE5.1的UMG和蓝图系统从零开始构建智慧城市数字孪生界面。通过环境准备、UMG界面设计、蓝图功能实现、数据绑定到最终打包发布的全流程指导,帮助开发者掌握数字孪生技术的核心应用,提升智慧城市可视化开发效率。

weixin_30251829的博客 619

【Qt】Qt之网格布局

00. 目录 文章目录00. 目录01. 概述02. 开发环境03. 常用函数详解04. Qt设计师使用网格布局05. 使用代码实现网格布局06. 附录 01. 概述 QGridLayout:格栅布局,也被称作网格布局(多行多列)。 栅格布局将位于其中的窗口部件放入一个网状的栅格之中。QGridLayout需要将提供给它的空间划分成的行和列,并把每个窗口部件插入并管理到正确的单元格。 栅格布局是这样工作的: 它计算了位于其中的空间,然后将它们合理的划分成若干个行(row)和列(column),并把每个由它管

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 1万+

从CAD到完美网格:HyperMesh几何清理全流程指南(2023最新版)

本文详细介绍了2023最新版HyperMesh在几何清理和网格划分方面的全流程操作指南。从CAD导入、几何修复到中面提取和网格生成,系统性地分享了实战验证的解决方案,帮助工程师高效处理复杂几何体,提升有限元模型质量。特别针对汽车和航空航天领域的常见问题,提供了智能化工具和优化技巧。

weixin_29306011的博客 224

2024年中科大分子生物研究生考试建议

分子生物学复习资料及往年考题。

qq_43337249的博客 2947

Qt 高级开发 022:栅格布局深度实战

本文详细介绍了在Qt桌面应用开发中使用QGridLayout栅格布局实现工业级登录界面的全过程。文章从项目需求分析入手,对比了三种主流布局的优缺点,强调栅格布局在复杂界面开发中的优势。通过纯代码开发模式,讲解了环境搭建、资源托管配置等前期准备,重点剖析了栅格布局的底层原理和核心API。实战部分提供了5行3列的网格矩阵设计、控件布局参数表以及完整的实现代码,帮助开发者掌握商用级界面的开发技巧。文章强调通过代码控制布局而非拖拽界面的重要性,以实现更灵活、可维护性更高的UI开发。

软件科学-郝学胜 994

Android Qcom USB Driver学习(五)

在前面的第二期中,我们知道一些非标的USB的充电类型Floatingcharger,其具有和普通DCP相似的大电流能力,但在最初检测的时候会限制Inputcurrentlimit到100mA,来进行检测是否是SDP类型,所以要支持大电流输入就需要进行vote操作,前面的几篇都有涉及,所以本文学习一下pmicusbcharger都相关的vote机制。...

Android驱动开发 2900

结合QT完成矩阵计算器(1)

随着科学计算的日益广泛,矩阵运算在各个领域得到越来越多的应用,实现一个功能全面且易于使用的矩阵计算器显得尤为重要。本文设计并实现了一个基于Qt的矩阵计算器,具有矩阵的基本运算、转置、求逆等功能。该计算器具有简洁的图形界面,用户可以方便地输入矩阵数据,选择所需的计算操作,并实时显示运算结果。相比传统的命令行界面,图形界面的矩阵计算器对用户更加友好,降低了使用难度。本文首先阐述了矩阵运算的基础知识,如矩阵的表示、加减法、数乘等运算规则。然后描述了基于Qt框架构建图形界面的设计思路,包括界面布局、各控件的添加。

yunlianghandsome的博客 1135

自动驾驶控制算法——MPC控制算法

自动驾驶MPC控制算法摘要 模型预测控制(MPC)是一种基于系统预测模型的先进控制算法,通过滚动优化方式求解最优控制输入。其核心流程包括:1)使用数学模型预测未来系统状态;2)定义优化目标函数衡量预测误差;3)求解满足约束的最优控制序列;4)仅执行第一步控制并重复该过程。 相比传统PID控制,MPC具有预测未来、多步优化、显式处理约束等优势,特别适合自动驾驶中对安全性要求高的场景,如轨迹跟踪、车道保持、联合纵横向控制、自动泊车和动态避障等。MPC通过状态空间模型预测系统行为,在每个控制周期计算未来N步的控制

swaggytiger的博客 7919

【AAOS】【源码分析】用户管理(五)-- MUMD介绍

MUMD(多用户多屏显示)是Android Automotive OS为车载多乘员场景设计的功能,支持不同座位用户独立操作各自屏幕。

码农的历程 1510

QT 实现跑马灯

背景 应项目需求,需要实现一个体现系统运行状态的类似跑马灯效果一样的控件,跑马灯还是本科电子工艺实习期间焊接电路板的时候接触过,初听要用qt实现这个效果,还觉得挺有意思的。开始是调研,理解了一篇博客分享的点阵LED,开始着手实现,最终实现了一个动态的显示状态的小控件。现分享一个实现该控件的一个简要思路。单个LED的设计完全是借鉴过来的,实现跑马灯的效果,主要的工作体现在灯的放置上,也算是存在一个小小的算法设计,虽然这是一个小功能,但是实现之后还是挺有成就感的,特分享出来,供他人做自定义控件...

u012342051的专栏 2947

LVGL 离线字体转换lv_font_conv本地安装

LVGL FONT CONV 离线版本

liu132641的专栏 3385

Qt-QML制作自定义组件(一)

Qt-QML制作自定义组件(一) 本文先讲制作组件的基础 绘制矩形 如图所示 我们绘制了一个圆角矩形 代码如下所示 Window { id: window visible: true width: 640 height: 480 title: qsTr("Hello World") Rectangle { id:mRectO...

qq_44728747的博客 944

详细解读经典跨模态对齐技术Q-Former代码

介绍BLIP2的博客层出不穷,介绍Q-Former的博客也不少,但是详细解读Q-Former代码的博客很少。这篇博客希望以代码为基础,讲明白Q-Former的原理和核心思想,并详细解读一些值得注意的细节。希望读者们能从这一经典技术中朝花夕拾,得到启发。

沉迷单车的追风少年 2459

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Qt计算器开发实战:从界面布局到核心逻辑的完整实现

图形用户界面(GUI)开发是软件工程中的重要领域,其核心在于将用户交互与后台逻辑高效解耦。Qt框架通过信号与槽机制实现了这一目标,该机制允许对象间进行松耦合通信,是Qt编程的基石。在工程实践中,掌握界面布局管理(如QGridLayout)和控件(如QPushButton、QLineEdit)的运用,是构建直观、响应式应用的关键。这些技术对于开发需要精确用户输入和即时反馈的工具(如计算器、数据仪表盘)具有极高价值。本文以开发一个功能完备的Qt计算器为例,深入探讨了如何运用信号与槽、状态机管理以及QSS样式表等

weixin_34090562的博客 393

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 我们一起玩python之 条件语句和循环语句
下一篇: Qt--实战小经验
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值