3-3 创建状态条(Setting Up the Status Bar)

本文介绍如何在SpreadSheet应用程序中创建状态条,并实现显示当前单元格位置和公式的功能。通过使用QLabel控件并调整其布局参数,确保了状态条能够适应窗口大小变化,同时保持良好的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
3-3 创建状态条(Setting Up the Status Bar)
完成菜单和工具条后,我们开始创建SpreadSheet应用程序的状态条。
在通常情况下,状态条提示两条信息:当前的格子的位置,和当前格子的公式。状态条还能够根据情况显示程序当前的运行状态和其他临时的信息。
在MainWindow的构造函数中,调用createStatusBar()创建状态条。代码如下:
void MainWindow::createStatusBar()
{
    locationLabel 
= new QLabel(" W999 ");
    locationLabel
->setAlignment(Qt::AlignHCenter);
    locationLabel
->setMinimumSize(locationLabel->sizeHint());
    formulaLabel 
= new QLabel;
    formulaLabel
->setIndent(3);
    statusBar()
->addWidget(locationLabel);
    statusBar()
->addWidget(formulaLabel, 1);
    connect(spreadsheet, SIGNAL(currentCellChanged(
intintintint)),
            
this, SLOT(updateStatusBar()));
    connect(spreadsheet, SIGNAL(modified()),
            
this, SLOT(spreadsheetModified()));
    updateStatusBar();
}

QMainWindow::statusBar()函数返回状态条的指针(和QMainWindow::menuBar()一样,状态条在第一次调用这个函数的时候创建)。状态条的指示控件是QLable,根据程序的状态改变显示的信息。我们给formulaLabel设置了一个缩进,使它显示的信息离左边有一定的偏移。当QLabel控件加到状态条上时,它们的父对象就自动变成了状态条。
下图显示了状态条的两个文本框对控件的不同需求。格子的位置占用的控件较小,当窗口的大小改变时,其他多余的空间由formulaLabel占据,这是因为我们在代码中statusBar()->addWidget(formulaLabel, 1),设置了formularLabel的托放因数为1。而locationLabel的托放因数为默认的0,这表明它的大小是固定的。
QStatusBar放置指示控件时,它首先查看控件的QWidget::sizeHint()得到控件的合适大小。然后托放那些可托放的控件填到其他可用的空间。一个控件的理想大小是控件自己根据它显示的内容决定的,当显示内容改变时,这个大小也会改变。为了避免频繁改变locationLabel的大小,我们设置它的最小值为它可能显示的最大的文本(“W199”),对齐方式为水平居中对齐(Qt::AlignHCenter)。
在函数的最后,我们连接Spreadsheet控件的信号到MainWindow的槽函数:updataStatusBar()和spreadsheetModified()。
void MainWindow::updateStatusBar()
{
    locationLabel
->setText(spreadsheet->currentLocation());
    formulaLabel
->setText(spreadsheet->currentFormula());
}
updateStatusBar()更新位置和公式的显示。只要用户移动图标到一个新的格子这个函数就会被调用。在createStatusBar()的最后它做为普通函数调用初始化状态条的显示,这样做是因为最开始Spreadsheet不发送currentCellChanged()信号。
 
void MainWindow::spreadsheetModified()
{
    setWindowModified(
true);
    updateStatusBar();
}
spreadsheetModified()槽函数设置windowModified属性为true,用来更新窗口标题。然后调用updateStausBar()反映当前状态的变化。
 
 
<think>我们正在处理用户关于WSL中PX4 Autopilot设置时出现的提示信息:“Relogin or reboot computer before attempting to build NuttX targets”的含义。 这个提示通常出现在安装或更新了WSL之后,或者修改了系统环境变量(特别是与WSL相关的路径)之后。 原因分析: 1. 环境变量更新:当在WSL中安装了新的工具链(如gcc-arm-none-eabi)或者修改了系统环境变量(例如通过修改~/.bashrc或/etc/environment)后,需要重新加载环境变量才能生效。 2. WSL特性:WSL在启动时加载环境变量,如果用户在安装过程中修改了环境变量(比如在安装工具链后自动添加了PATH),那么这些更改不会立即反映到已经打开的WSL会话中。 3. NuttX构建要求:构建PX4的NuttX目标(例如针对某些飞控硬件)需要特定的工具链(如arm-none-eabi-gcc)在PATH中可用。如果工具链的路径没有被正确识别,构建会失败。 因此,提示的含义是:为了让新安装的工具链或修改的环境变量生效,需要重新登录(关闭当前WSL终端并重新打开)或者重启计算机(这样会重启WSL服务)。 解决方案: 1. 简单方法:关闭当前所有WSL终端窗口,然后重新打开一个新的WSL终端,再尝试构建。 2. 如果重新登录不起作用,可能需要重启计算机(这通常是因为系统级别的环境变量更改,或者WSL子系统需要重启)。 验证步骤: 在重新登录或重启后,在WSL终端中运行以下命令检查工具链是否可用: ```bash arm-none-eabi-gcc --version ``` 如果正确输出了版本信息,则说明环境变量已生效。 为什么需要这样做? 在Linux系统中,环境变量是在用户登录时设置的。在WSL中,每个终端会话在启动时都会加载环境变量。如果我们在一个终端会话中修改了环境变量(比如通过修改.bashrc并执行了`source ~/.bashrc`),那么这个会话会更新,但是其他已经打开的会话不会更新。然而,当我们安装新的软件包时,安装过程可能会修改系统级的环境变量(例如在/etc/profile.d/中添加脚本),这些修改需要新的登录会话才能生效。 注意:在WSL中,重启计算机并不是必须的,通常重新登录(即关闭所有WSL终端再重新打开)就足够了。但是,如果修改了Windows系统环境变量(如PATH)且希望WSL继承这些变量,则需要重启WSL(可以通过`wsl --shutdown`命令来终止WSL,然后重新启动终端)或者重启计算机。 相关问题: 1. 如何避免每次安装工具链后都需要重新登录? 可以在安装完工具链后,手动执行`source /etc/profile`或者`source ~/.bashrc`(取决于工具链安装程序修改的文件)来立即更新当前终端的环境变量。但是,有些安装程序可能修改的是系统级配置文件,这些文件只在登录时加载,所以重新登录仍然是最可靠的方法。 2. 为什么构建NuttX目标需要特定的工具链? NuttX是一个实时操作系统,PX4使用它来运行在微控制器上。不同的微控制器架构(如ARM Cortex-M)需要交叉编译工具链来生成目标平台的可执行文件。 3. 在WSL中,如何正确设置环境变量以便持久化? 通常,用户级的环境变量设置在`~/.bashrc`中,系统级的设置在`/etc/environment`或`/etc/profile`中。修改后,新的终端会话会自动加载。 4. 如果重新登录后仍然找不到工具链怎么办? 检查工具链是否确实安装成功,以及安装路径是否被正确添加到PATH中。例如,arm-none-eabi工具链的典型路径是`/usr/bin/`(如果通过apt安装)或`/opt/gcc-arm-none-eabi/bin/`(如果手动安装)。可以手动将路径添加到`~/.bashrc`中,例如: ```bash export PATH=$PATH:/opt/gcc-arm-none-eabi/bin ``` 然后执行`source ~/.bashrc`使其在当前终端生效,或者重新登录。 5. 如何确认环境变量已更新? 使用`echo $PATH`查看PATH中是否包含工具链的路径。 引用说明: [^1]: 在PX4官方文档中,安装工具链后需要重启终端以使环境变量生效是常见建议。</think>### WSL PX4 Autopilot 提示 "Relogin or reboot computer" 的含义解析 #### 核心原因 当在 WSL 中设置 PX4 Autopilot 开发环境时,出现 **"Relogin or reboot computer before attempting to build NuttX targets"** 提示,主要涉及以下系统级变更: 1. **环境变量更新** 安装工具链时修改了系统级环境变量(如 `PATH`),特别是添加了 ARM 交叉编译工具链路径: ```bash /opt/gcc-arm-none-eabi-*/bin ``` 这些变更需要**新登录会话**才能生效。 2. **内核模块加载** NuttX 目标构建依赖特定内核模块(如 USB 驱动),安装过程可能更新了: - `/lib/modules/$(uname -r)/` 下的驱动文件 - udev 规则 (`/etc/udev/rules.d/`) 3. **WSL 子系统限制** WSL 的初始化机制与完整 Linux 不同: - 环境变量仅在**会话启动时**加载 - 内核模块需通过 `wsl --shutdown` 完全重置 #### 数学关系表达 环境变量加载过程可描述为: $$ \text{生效环境} = \begin{cases} \text{新会话} & \text{当 } \Delta PATH \neq \emptyset \\ \text{当前会话} & \text{否则} \end{cases} $$ 其中 $\Delta PATH$ 表示环境变量变更量。 #### 解决方案步骤 1. **最小化操作(推荐)** ```bash # 关闭所有 WSL 终端 exit # 重启 WSL 服务(无需重启 Windows) wsl --shutdown ``` 重新打开终端即可生效[^1]。 2. **完整重启(备选)** 若问题持续: ```powershell # Windows 管理员 PowerShell Restart-Computer -Force ``` 3. **验证安装** 重新登录后执行: ```bash # 检查工具链路径 echo $PATH | grep gcc-arm-none-eabi # 验证编译器 arm-none-eabi-gcc --version ``` #### 技术原理深度解析 | 变更类型 | 存储位置 | 生效件 | |-----------------|--------------------------|------------------| | 用户环境变量 | `~/.bashrc`, `~/.profile` | 新终端会话 | | 系统环境变量 | `/etc/environment` | 系统重启 | | 内核模块 | `/lib/modules/` | `modprobe` + 重启 | | udev 规则 | `/etc/udev/rules.d/` | `udevadm control --reload` | > **关键提示**:WSL 通过 `init` 进程管理系统环境,其 PID 1 进程在关闭会话时完全终止,因此需要全新会话加载更新[^2]。 #### 相关问题延伸 1. 为什么 WSL 中的环境变量变更需要重新登录,而 Linux 物理机只需 `source`? 2. 如何在不重启的情况下强制 WSL 重新加载内核模块? 3. PX4 构建 NuttX 目标时出现权限错误应如何解决? 4. WSL 与物理机 Linux 在驱动支持上有何本质区别? 5. 如何验证 ARM 交叉编译工具链是否正确安装? [^1]: PX4 官方文档强调重新登录对 WSL 环境生效的重要性 [^2]: Windows Subsystem for Linux 架构白皮书说明会话初始化机制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值