You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt跨类访问GUI界面或用connect更新UI元素的实现问题

如何从其他类/文件访问Qt GUI的UI界面

背景

我在一个控制USRP收发数据的多文件项目中工作,项目包含多种参数(起始频率、步长、接收时长等)。原本需要手动修改多个cpp文件的参数值,重新编译后运行可执行文件。现在我在main.cpp中编写了一个简单的Qt GUI界面,用户可在GUI中输入USRP接收基础参数,界面能将这些值传入执行USRP功能的函数,这部分已正常运行。

我希望在主GUI窗口通过LCDNumber部件显示当前频率,该频率由另一个cpp文件中的类管理。

我的尝试

尝试1:直接在频率类中访问MainWindow的UI

在freq_transmit.cpp中引入相关头文件后,尝试直接操作UI组件:

// freq_transmit.cpp
......
#include "mainwindow.hpp"
#include "ui_mainwindow.hpp"
.....
void Receiver::run()
{
   // 大量USRP相关代码
    .....
   rxCenterFreq; // <--- 存储当前频率的变量(每秒变化)
   ui->lcdnumber->display(rxCenterFreq);  // <--- 编译错误:ui未在此作用域中声明
  ............

mainwindow.h代码未修改,编译报错:ui not declared in this scope。

尝试2:使用Qt信号槽机制

步骤1:在freq_transmit.hpp头文件中定义信号

// freq_transmit.hpp
....
signals:
     void sendTXFreq(double a);

步骤2:在freq_transmit.cpp中发射信号

// freq_transmit.cpp
......
#include "mainwindow.hpp"
#include "ui_mainwindow.hpp"
.....
void Receiver::run()
{
   // 大量USRP相关代码
    .....
   emit sendTXFreq(rxCenterFreq); // 向QT发射信号
   ....

步骤3:在mainwindow.h中声明接收信号的槽函数

// mainwindow.h
...
public slots:
    void updateTXFreq(double a);

步骤4:实现槽函数并建立信号槽连接

// mainwindow.cpp
....
void MainWindow::updateTXFreq(double a)
{
     ui->lcdnumber->display(a);
}

connect(&Receiver, &Receiver::sendTXFreq, this, &MainWindow::updateTXFreq); // <--- 编译错误:','前需要主表达式

编译错误出在&Receiver处,Receiver是包含run()函数的类。

核心需求

将动态生成的频率值关联到LCDNumber部件,使其在USRP代码运行时实时在GUI上显示频率值。

注:我是C++和Qt GUI的初学者,有人建议在freq_transmit.cpp中创建MainWindow的指针以直接访问UI元素,但尝试后并未成功,希望得到指导。

内容的提问来源于stack exchange,提问作者NoRainDropsInTheSky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:30:46