避开这5个QLayout坑!QT设计师必知的布局管理陷阱

qt页面设计 如果按钮比较多需要很多信号槽的连接,除了可以使用多对一的连接方式以外,还可以使用QButtonGroup对按钮进行分组,可以针对一个组设置信号槽。信号函数分为四组,对应的触发效果就是之前QAbstractButton信号的四种效果,区别每组重载函数的参数不同。C++程序员通常不会单独启动Designer,如果要在项目中使用Designer程序,只需要在新建项目时,勾选“创建界面文件”选项。可以把布局看做是一个透明的盒子,内部放置各种组件对象,这些组件对象会按照布局预设的规则自动排序,并形成一个布局整体。 阅读详情

避开这5个QLayout坑!QT设计师必知的布局管理陷阱

在QT的GUI开发世界里,布局管理器(QLayout)无疑是构建美观、自适应界面的基石。无论是简单的登录框,还是复杂的仪表盘,我们都在与QHBoxLayout、QVBoxLayout、QGridLayout这些老朋友打交道。然而,正是这些看似简单的工具,在实际项目中却布满了“温柔的陷阱”。很多中级开发者,甚至一些经验丰富的老手,都曾在这里栽过跟头——界面在某个分辨率下完美无缺,换个屏幕就错位;动态添加的控件神秘消失;自定义组件永远无法获得理想的大小……这些问题往往不是QT的Bug,而是我们对布局管理器内部机制的理解出现了偏差。

这篇文章,我想和你聊聊那些使用QLayout时最容易忽略,却又至关重要的细节。我不会重复教科书上的基础用法,而是聚焦于五个真实项目中高频出现的“坑”。我们会从父子关系的微妙之处,一直聊到updateGeometry()的正确调用时机,结合具体的代码片段和报错案例,让你不仅知道“是什么”,更明白“为什么”以及“怎么办”。如果你曾为布局问题调试到深夜,那么接下来的内容,或许能为你点亮一盏灯。

1. 父子关系与内存管理的隐形炸弹

第一个陷阱,也是最基础、最容易被误解的一点:布局中的控件,其父对象到底是谁?

很多开发者,尤其是从其他GUI框架转过来的,会下意识地认为,既然控件被添加到了QHBoxLayout里,那么这个QHBoxLayout就是控件的父对象。这是一个极其危险的误解。在QT的世界里,控件(QWidget)的父对象只能是另一个控件,绝不能是一个布局(QLayout)。

让我们看一段典型的错误代码及其后果:

// 错误示例:对父子关系的误解
void setupUI() {
    QWidget *window = new QWidget;
    QHBoxLayout *layout = new QHBoxLayout; // 布局没有指定父对象

    QPushButton *btn1 = new QPushButton("Button 1", layout); // 错误!试图将布局设为父对象
    QPushButton *btn2 = new QPushButton("Button 2");

    layout->addWidget(btn2);
    window->setLayout(layout);
    window->show();
}

上面代码中,btn1的构造方式是完全错误的。QLayout并非QWidget的子类,它继承自QObject。当你调用addWidget()时,布局管理器会自动调用该控件的setParent()方法,将其父对象设置为安装了此布局的那个控件(本例中是window)。这个过程是隐式的,但至关重要。

正确的做法是,在创建要放入布局的控件时,无需(也不应该)指定父对象:

// 正确示例:让布局自动管理父子关系
void setupUI() {
    QWidget *window = new QWidget;
    QHBoxLayout *layout = new QHBoxLayout(window); // 布局的父对象可以是窗口,但不是必须

    QPushButton *btn1 = new QPushButton("Button 1"); // 不指定parent
    QPushButton *btn2 = new QPushButton("Button 2"); // 不指定parent

    layout->addWidget(btn1);
    layout->addWidget(btn2);
    // 在addWidget的瞬间,btn1和btn2的parent被自动设置为window
    window->setLayout(layout); // 如果布局构造时未指定父对象,在此处设置
    window->show();
}

注意:如果你在布局构造时就传入了父窗口指针(new QHBoxLayout(window)),那么后续setLayout的调用就不是必须的。但显式调用setLayout是一个更清晰、更不易出错的好习惯。

这个陷阱的衍生问题:内存泄漏。 如果你手动管理内存(即使用new创建对象而未使用父子关系自动删除),错误地理解了父子关系,可能会导致控件没有被正确销毁。当父窗口被销毁时,它会递归销毁所有子控件。如果控件的父对象设置错误(比如设为了布局),它就不会被自动清理。

如何检查与调试:

  • 在调试器中,观察控件的parent()返回值。
  • 使用QObject::dumpObjectTree()在控制台输出对象树,清晰查看父子关系。

2. SizePolicy设置不当:控件行为的“失控”

QSizePolicy是QT布局系统的灵魂,它决定了控件在布局中如何响应空间变化。然而,它的默认行为常常与我们的直觉相悖,导致控件“该大的时候不大,该小的时候不小”。

QSizePolicy包含水平和垂直两个方向的政策,每个方向都有以下主要类型:

策略类型常量含义
固定Fixed控件无法改变大小,始终为其sizeHint()。
最小MinimumsizeHint()是控件的最小尺寸,可以拉伸,但不能再缩小。
最大MaximumsizeHint()是控件的最大尺寸,可以缩小,但不能再扩大。
首选PreferredsizeHint()是控件的理想尺寸,可以缩小也可以扩大。
扩展Expanding控件希望尽可能变大。它会主动争夺多余空间,比Preferred优先级更高。
忽略Ignored控件的sizeHint()被忽略,它将尽可能占据所有可用空间。

最常见的坑:QPushButton和QLabel的默认策略。

  • QPushButton的默认水平策略是Preferred,垂直策略是Fixed。这意味着按钮的宽度可以变化,但高度是固定的。这解释了为什么在垂直布局中,按钮不会随着窗口变高而变高。
  • QLabel的默认策略也是Preferred。但如果它没有文本(比如只用于显示图片),它的sizeHint()可能很小,导致在布局中几乎看不见。

实战案例:让按钮填满可用空间 假设我们有一个水平布局,里面有两个按钮,我们希望当窗口拉宽时,第二个按钮能自动拉伸填满空间。

void setupStretchyButtons() {
    QWidget *window = new QWidget;
    QHBoxLayout *layout = new QHBoxLayout(window);

    QPushButton *btnFixed = new QPushButton("固定大小");
    QPushButton *btnStretch = new QPushButton("拉伸按钮");

    // 关键步骤:修改第二个按钮的SizePolicy
    QSizePolicy policy = btnStretch->sizePolicy();
    policy.setHorizontalPolicy(QSizePolicy::Expanding); // 水平方向希望扩展
    btnStretch->setSizePolicy(policy);

    layout->addWidget(btnFixed);
    layout->addWidget(btnStretch); // 这个按钮会占据多余的水平空间

    window->resize(400, 100);
    window->show();
}

仅仅修改SizePolicy有时还不够,还需要结合拉伸因子(Stretch Factor)。拉伸因子是一个整数,用于在多个具有相同扩展意愿的控件之间按比例分配空间。默认拉伸因子为0。

// 在水平布局中,按1:2的比例分配额外空间给两个按钮
layout->addWidget(btn1, 1); // 拉伸因子为1
layout->addWidget(btn2, 2); // 拉伸因子为2
// 当有额外水平空间时,btn2获得的宽度将是btn1的两倍

一个隐蔽的坑:Expanding vs Preferred with Stretch 很多人认为设置了拉伸因子就万事大吉。但如果控件的水平策略是Preferred,它虽然会根据拉伸因子分配空间,但一旦达到其sizeHint()的大小,它就不会再变大了。只有将策略设置为Expanding或Ignored,控件才会愿意超越其理想尺寸,去填充根据拉伸因子分配到的所有空间。

3. 嵌套布局与空间分配的优先级混乱

复杂的界面必然涉及布局的嵌套。然而,嵌套布局中空间的分配遵循一套严格的优先级规则,理解错误就会导致内层布局被“挤压”或“撑破”。

布局空间分配的核心流程如下:

  1. 计算最小空间:布局首先询问其所有子项(控件或子布局)的minimumSize()和sizeHint(),计算出自己所需的最小空间。
  2. 申请空间:父布局(或父窗口)根据自身的大小和约束,分配一块空间给该布局。
  3. 内部分配:
    • 首先,满足所有子项的最小尺寸要求。这是硬性条件,优先级最高。
    • 然后,将剩余空间分配给那些SizePolicy为Expanding或Ignored的子项。
    • 如果还有空间,再根据拉伸因子的比例,分配给策略为Preferred或Expanding的子项。
    • 策略为Fixed或Maximum的子项,不会获得超过其sizeHint()或maximumSize()的空间。

嵌套布局的典型问题场景: 你有一个垂直布局(MainLayout),里面包含一个分组框(QGroupBox),分组框内部使用网格布局(InnerGridLayout)。当你缩小主窗口时,分组框被压缩,但内部的网格布局控件却重叠或显示不全了。

问题根源:QGroupBox作为一个容器控件,它有自己的sizeHint()和minimumSizeHint()。当外层垂直布局空间不足时,它会先压缩QGroupBox。如果压缩到小于QGroupBox的minimumSizeHint(),QGroupBox会停止缩小(可能显示滚动条或裁剪内容)。但此时,QGroupBox内部网格布局所需的最小空间可能已经大于QGroupBox当前被分配到的空间,导致内部控件布局错乱。

解决方案与技巧:

  • 为容器控件设置合理的最小尺寸:重写QGroupBox的minimumSizeHint(),使其至少能容纳内部布局的最小需求。
    class MyGroupBox : public QGroupBox {
        QSize minimumSizeHint() const override {
            // 返回内部布局的最小尺寸,加上分组框自身的边框、标题栏等边距
            if (layout()) {
                return layout()->minimumSize() + QSize(20, 40); // 估算边距
            }
            return QGroupBox::minimumSizeHint();
        }
    };
    
  • 使用QScrollArea:对于内容可能超出显示区域的复杂面板,将其放入QScrollArea中是更优雅的方案。这样外层布局只需给QScrollArea一个固定大小,内部内容可以通过滚动查看。
  • 谨慎使用setFixedSize:在嵌套布局的中间层控件上调用setFixedSize,会完全阻断布局的弹性,应尽量避免。如果非要固定尺寸,最好在最外层窗口或最内层控件上设置。

4. 控件动态显示/隐藏时的布局“抖动”

在需要动态切换界面状态的场景中,我们经常需要隐藏或显示某些控件。一个常见的错误是直接调用widget->setVisible(false),然后发现布局留下了一个难看的空白区域,其他控件也没有自动填补上来。

原因:隐藏控件(setVisible(false))并不会将其从布局中移除。布局在计算几何形状时,仍然会为这个隐藏的控件保留空间(其minimumSize可能为0,但sizeHint可能还有值)。因此,空间没有被重新分配。

正确的做法是使用布局项(QLayoutItem)的隐藏机制,或者动态增删:

方法一:使用QWidget::setVisible配合布局的sizeHint重写(适用于简单情况) 隐藏控件后,必须通知布局重新计算。这需要你确保隐藏控件的sizeHint()在隐藏时返回一个非常小的值或零。

class DynamicWidget : public QWidget {
    Q_OBJECT
public:
    QSize sizeHint() const override {
        if (isHidden()) {
            return QSize(0, 0); // 隐藏时返回零大小
        }
        return QWidget::sizeHint();
    }
};
// 隐藏后,需要手动触发布局更新
widget->hide();
widget->updateGeometry(); // 关键!通知布局此控件的sizeHint已变

方法二:使用布局的addWidget/removeWidget或insertWidget/takeAt(更彻底) 这种方法将控件完全从布局的管理中移除或加入,是处理复杂动态变化的首选。

// 假设有一个垂直布局verticalLayout和一个按钮btnToToggle
void toggleButton(bool show) {
    if (show) {
        // 需要显示时,插入到布局中(例如,插入到索引0的位置)
        verticalLayout->insertWidget(0, btnToToggle);
    } else {
        // 需要隐藏时,从布局中取出
        QLayoutItem *item = verticalLayout->takeAt(0); // 需要知道索引
        // 注意:takeAt返回的item需要管理其生命周期,通常删除item但不删除widget
        if (item) {
            delete item; // 删除布局项
            // widget btnToToggle 本身没有被删除,只是不再被布局管理
        }
        btnToToggle->hide(); // 隐藏控件
    }
    // 布局会自动更新
}

方法三:使用QStackedLayout或QStackedWidget 如果你是在几个完整的、不同布局的页面之间切换,那么QStackedLayout是专为此场景设计的。它在同一时间只显示一个子控件,其他控件完全不被考虑在布局计算内,不会有任何“残留空间”的问题。

提示:对于简单的显隐,Qt 5.2之后为QPropertyAnimation提供了对QWidget的geometry属性动画的支持,结合sizeHint的变化,可以实现平滑的展开/折叠效果,这比粗暴的显隐用户体验好得多。

5. 自定义控件与updateGeometry()的调用时机

当你需要创建自定义的、具有复杂内部布局或绘制逻辑的控件时,你必须明确地告诉QT布局系统你的控件想要多大、能多大、能多小。这就是sizeHint()、minimumSizeHint()和sizePolicy的用武之地。但还有一个至关重要的函数常常被遗忘:updateGeometry()。

updateGeometry()的作用:它向父布局发送一个信号,表明这个控件的“尺寸提示”或“尺寸策略”已经发生了变化,父布局需要重新计算所有子项的几何分布。这是一个请求,而不是一个立即执行的动作。 多次连续调用updateGeometry(),在下一个事件循环中通常只会触发一次重新布局。

何时必须调用updateGeometry()? 只要你的自定义控件的sizeHint()、minimumSizeHint()或sizePolicy()的返回值在运行时发生了改变,你就必须调用它。

典型踩坑案例:一个根据文本长度改变大小的标签

class ResizableLabel : public QLabel {
    Q_OBJECT
public:
    void setDynamicText(const QString &text) {
        setText(text);
        // 文本改变了,sizeHint()的返回值也变了!
        // 如果不调用updateGeometry,父布局不知道它需要更多/更少空间
        updateGeometry(); // 必须调用!
    }
};

更复杂的案例:实现HeightForWidth 有些控件的高度取决于其宽度,例如自动换行的富文本标签。你需要:

  1. 在控件的sizePolicy中设置setHeightForWidth(true)。
  2. 重写heightForWidth(int w)函数,计算并返回给定宽度w下的理想高度。
  3. 同样,当内容变化导致heightForWidth的计算逻辑变化时,也需要调用updateGeometry()。
class WrappingLabel : public QLabel {
    Q_OBJECT
public:
    WrappingLabel(const QString &text, QWidget *parent = nullptr)
        : QLabel(text, parent) {
        setWordWrap(true);
        QSizePolicy sp = sizePolicy();
        sp.setHeightForWidth(true);
        setSizePolicy(sp);
    }

    bool hasHeightForWidth() const override { return true; }

    int heightForWidth(int width) const override {
        // 一个简化的计算:根据宽度、字体、文本来估算所需高度
        QFontMetrics fm(font());
        int textWidth = width - contentsMargins().left() - contentsMargins().right() - 2; // 减去边距和边框
        QRect textRect = fm.boundingRect(0, 0, textWidth, 0,
                                         Qt::TextWordWrap | alignment(), text());
        return textRect.height() + contentsMargins().top() + contentsMargins().bottom();
    }

    QSize sizeHint() const override {
        // 即使有heightForWidth,提供一个合理的sizeHint也是好习惯
        // 例如,返回一个基于默认宽度的尺寸
        int defaultWidth = 200;
        return QSize(defaultWidth, heightForWidth(defaultWidth));
    }

    void setText(const QString &text) {
        QLabel::setText(text);
        updateGeometry(); // 内容变了,高度计算也变了,必须更新!
    }
};

最后的提醒:updateGeometry()调用的是控件的父布局的更新。如果你的自定义控件本身就是一个顶层容器,或者其父布局暂时为空,调用它可能没有立即效果。但这是一个安全的习惯,确保当控件被加入布局后,状态是正确的。

我在重构一个大型配置对话框时,曾因为一个自定义的、可折叠的QGroupBox没有在展开/折叠时正确调用updateGeometry(),导致下方的所有控件位置错乱,花了整整一个下午才定位到这个看似微不足道的问题。自那以后,我在任何可能影响尺寸提示的地方,都会条件反射般地思考是否需要调用updateGeometry()。

Qt跨平台开发指南:从C++ GUI框架到全平台应用解决方案 跨平台应用开发是软件开发中的核心需求,旨在实现一套代码在多个操作系统上运行,从而降低开发与维护成本。其技术原理通常涉及抽象层封装和统一API设计,将不同平台的底层差异进行屏蔽。在众多技术方案中,C++因其高性能和丰富的生态,常被用于开发对性能有苛刻要求的桌面、嵌入式及工业软件。Qt框架正是这一领域的杰出代表,它通过独特的元对象系统和信号槽机制,为C++注入了动态能力,并提供了从传统命令式的Qt Widgets到现代声明式的Qt Quick/QML两种编程范式。这使得开发者既能利用C++的极致性能处理核心业务 阅读详情

相关推荐

Qt设计师属性系列:FormLayout(表单布局)

Layout(布局): layoutFieldGrowthPolicy: from:formLayout的layoutFieldGrowthPolicy属性(作者:老猿Python)

前进加油 2258

[QT_045]Qt学习之水平(QHBoxLayout )和垂直布局器(QVBoxLayout)

Qt学习之水平(QHBoxLayout )和垂直布局器(QVBoxLayout)

kongcheng253的博客 8813

Qt入门教程【Core篇】Layout布局(布局管理器、手动布局)

Qt常用布局剖析

小鱼酱的博客 3万+

Qt入门-layout布局

 开发一个图形界面应用程序,界面的布局影响到界面的美观。在设计一个界面之前,应该考虑到开发的界面可能给不用的用户使用,而用户的屏幕大小、纵横比例、分辨率可能不同,界面还可能是可缩放的,程序应该可以适应这些变化。         前面的程序中都是使用setGeometry()方法定位控件的位置,这个方法比较笨拙。试想如果控件很多,布局这些控件需要编写大量的代码。幸运的是,QT提供了更好的方法布局控...

weixin_34128501的博客 407

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?.docx

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?

科技中介服务机构如何通过智能体技术提升服务效率与专业度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Qt Designer中的layoutstretch属性

冲击年薪50W,助你进阶Python工程师>>> ...

Gelare的博客 2641

产业园区如何高效对接企业技术需求并推动成果转化?观点作者:科易网-国家科技成果转化(厦门)示范基地.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

使用Qt Designer进行布局

欢迎加入QQ群:853840665,群内分享大量资料,供大家学习     在使用Form之前,需要将Form上的对象放置到布局中。这确保在应用程序中预览或使用Form时,对象将正确显示。在布局中放置对象还可以确保在调整窗体大小时它们也能正确调整大小。 应用和打断布局     管理对象的最简单方法是对一组现有对象应用布局。通过选择需要管理的对象并使用主工具栏、菜单或上下文菜单应用到标准布局...

亚洲程序员盟主得博客 5万+

山区道路边坡落石隐患检测数据集VOC+YOLO格式241张1类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

高空作业栏杆检测数据集VOC+YOLO格式230张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

QT常用布局layout快速入门

layout继承图 用layout布局实现下面的窗口效果

wjysg8408982的博客 4698

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

无功优化电网故障下分布式能源系统多目标优化[并网转换器(GCC)](Matlab代码&Simulink实现)

内容概要:本文详细介绍了基于Plecs或Simulink平台构建的全桥LLC谐振变换器仿真模型,重点研究了变频控制与移相混合控制策略下的闭环系统设计与参数优化方法。内容涵盖全桥LLC谐振变换器的工作原理、小信号建模技术(如扩展描述函数EDF)、PID控制器参数整定过程以及软开关实现条件,并通过仿真验证了系统在稳态输出性能、动态响应特性(如启动过程与负载阶跃)和频率调节平滑性等方面的优良表现。同时提供了完整的仿真模型、参数设计报告及说明文档,有助于读者复现结果并深入理解控制机制与建模细节。; 适合人群:具备电力电子、自动控制等相关专业知识背景,从事高效率电源设计、新能源变换系统研发的工程师及高等院校电力电子与电力传动方向的研究生。; 使用场景及目标:①掌握LLC谐振变换器的小信号建模与闭环控制系统设计方法;②学习并应用变频与移相结合控制策略提升电源转换效率;③支撑科研项目中的电力电子系统仿真验证或学位论文课题开发;④复现高水平学术论文中关于谐振变换器的控制方案与性能分析。; 阅读建议:建议结合所提供的仿真模型与参数设计资料,边运行仿真边对照文章内容理解控制逻辑与建模过程,特别关注小信号模型的建立方法与PID控制器参数整定环节,以增强对实际工程问题的分析与设计能力。

光伏板太阳能板尘土灰尘脏污检测数据集VOC+YOLO格式1006张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

Android 面试题 Handler篇

1.Handler的实现原理。

ViewHandKownHealth的博客 955
上一篇: 三极管放大电路设计避坑指南:为什么你的电路总失真?从输入电阻到通频带全解析
下一篇: Vue项目代码量统计终极指南:从HTML到Vue文件的行数计算(附常见问题解决)
tensorflowjs6
博客等级 码龄3年 154粉丝 1495原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值