🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。
  
📌 特别说明:
文中问题案例来源于真实生产环境与公开技术社区,并结合多位一线资深工程师与架构师的长期实践经验,经过筛选与系统化整理后输出。文中的解决方案并非唯一“标准答案”,而是兼顾可行性、可复现性与思路启发性的实践参考,供你在实际项目中灵活运用与演进。
  
欢迎你 关注、收藏并订阅本专栏,与持续更新的技术干货同行,一起让问题变资产,让经验可复制,技术跃迁,稳步向上。

📢 问题描述

问题描述:QC查找/添加槽错误。-QtCreator:The class containing “Ui::Pictureshow Button” could not be found…如何解决?

报错截图如下:


具体报错code如下:

 QC查找/添加槽错误.-QtCreator                                                                    X
       The class containing "Ui::Pictureshow Button" could not be found
        im
        D:
        ZZZM PROJECTIQt\MarsonicsDAQ CdemolDemoldaqwidget.cpp.
       Pleaseverifythe#include-directives.
                                                             OK

📣 请知悉:如下方案不保证一定适配你的问题!

  如下是针对上述问题进行专业角度剖析答疑,不喜勿喷,仅供参考:

✅️问题理解

你在 Qt Designer 里对 Pictureshow_Button(这是 对象名 objectName)执行“转到槽/查找添加槽”,Qt Creator 弹出:

The class containing "Ui::Pictureshow_Button" could not be found
Please verify the #include-directives.
(位置:.../daqwidget.cpp)

核心意思:Creator 无法在 daqwidget.cpp 里找到对应的 UI 类定义,也就不知道应该把槽函数加到哪个类中。最常见根因是下面几类(命中率从高到低):

  1. 没有包含生成的头文件 #include "ui_daqwidget.h"(或包含错地方/文件名不匹配)。
  2. .ui 的类名 与 你的 C++ 类名不匹配(例如 .ui 中 <class>DaqWidget</class> 与你的 class DaqWidget 不一致,或你是“纯表单”而非“表单类”创建的)。
  3. 头文件缺少 Q_OBJECT,导致 MOC/自动连接不可用,Creator 也难以解析所属类。
  4. 没有把 .ui 加入构建(qmake: FORMS += daqwidget.ui;CMake: qt_add_ui/qt_wrap_ui),导致 ui_daqwidget.h 没有生成或在旧路径。
  5. 类名大小写/文件名不一致(Windows 上不敏感,Git/CMake/qmake 内部仍可能大小写不一致导致找不到)。
  6. 你创建的是“Qt Designer Form(纯 .ui)”而非“Qt Designer Form Class(ui+cpp+hdr)”,后来手写类时未按模板写对成员与命名空间。
  7. 多重包含/命名空间错位/路径多项目 导致 Creator 解析到另一个同名 daqwidget.cpp,从而找不到 Ui::<YourClass>

注意:提示里出现 Ui::Pictureshow_Button 其实暴露了线索——Pictureshow_Button 是控件的 objectName,不是 UI 类名。Creator 之所以这样显示,是因为它没能解析到正确的 Ui::<FormClass>,于是“把控件名错当类名”。所以基本可以锁定是 UI 生成头没被包含 / 类名不匹配

✅️问题解决方案

下面给你一套一步到位的排查与修复清单(qmake 与 CMake 都给)。按顺序做,通常 5–10 分钟能根治。

1)确认 .ui 与 C++ 类名一致
  • 用文本编辑器打开 daqwidget.ui,找到:

    <class>DaqWidget</class>
    

    把这里的类名与你头文件中的类名 逐字符对应(区分大小写):

    // daqwidget.h
    class DaqWidget : public QWidget
    {
        Q_OBJECT
        ...
    };
    
  • 若不一致(例如 .ui 是 FormWidgetdaqwidget),统一改成你的 C++ 类名,保存。

2)检查头文件(必须含 Q_OBJECT、Ui 前向声明、成员指针)
// daqwidget.h
#pragma once
#include <QWidget>

namespace Ui { class DaqWidget; }   // 前向声明,类名要和 .ui 的 <class> 一致

class DaqWidget : public QWidget
{
    Q_OBJECT                                    // ★ 必须有
public:
    explicit DaqWidget(QWidget *parent = nullptr);
    ~DaqWidget();

private:
    Ui::DaqWidget *ui;                          // ★ 指向生成的 UI 类
};
3)检查 cpp(必须包含生成的 ui_*.h,构造里 setupUi)
// daqwidget.cpp
#include "daqwidget.h"
#include "ui_daqwidget.h"           // ★ 关键:包含生成头,文件名是 ui_ + .ui 文件名

DaqWidget::DaqWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::DaqWidget)         // ★ 类型名要与 namespace Ui 内一致
{
    ui->setupUi(this);              // ★ 初始化 UI
}

DaqWidget::~DaqWidget()
{
    delete ui;
}

小贴士:ui_daqwidget.h 的名字来自 .ui 文件名。如果你的 ui 文件叫 daqWidget.ui,生成的可能叫 ui_daqWidget.h大小写保持一致

4)确保把 .ui 纳入构建并重新生成(qmake/CMake)
  • qmake(.pro)

    QT += widgets
    FORMS += daqwidget.ui           # ★ 必须有
    HEADERS += daqwidget.h
    SOURCES += daqwidget.cpp
    

    在 Qt Creator 里执行:工具栏 > 运行 qmake(或“重新配置项目”) → 完整清理并重建。

  • CMake(Qt6 推荐写法)

    find_package(Qt6 REQUIRED COMPONENTS Widgets)
    
    qt_add_executable(MyApp
        daqwidget.h
        daqwidget.cpp
        daqwidget.ui            # ★ 直接列出 .ui
        main.cpp
    )
    target_link_libraries(MyApp PRIVATE Qt6::Widgets)
    

    重新配置(Build > Clean All,然后 Run CMake)再全量构建。

如果你用的是 Qt5 + 旧 CMake,可能使用 qt5_wrap_ui(UI_HDRS daqwidget.ui),并把 UI_HDRS 加到目标里。

5)清理缓存 & 全量重建
  • 关闭 Qt Creator 的 UI 设计器(避免文件被占用)。
  • 删除构建目录(如 build-xxx),重新构建。
  • 如果你从其它路径拷贝项目,确认 没有同名的旧构建目录 让 Creator 解析错位置。
6)再试“转到槽”的两种可靠方式
  • 方式 A:选中按钮,在设计器里右击 → 转到槽

  • 方式 B:直接写自动连接槽(无需“转到槽”对话框):

    // 在 DaqWidget 类里添加(自动连接规则:on_<objectName>_<signal>())
    private slots:
        void on_Pictureshow_Button_clicked();  // 假设信号是 clicked()
    
    // 实现
    void DaqWidget::on_Pictureshow_Button_clicked()
    {
        // TODO
    }
    

    只要 Q_OBJECT + ui->setupUi(this) 正常,这个函数会被自动连接。

7)如果是“提升的控件”(Promoted Widgets)

Pictureshow_Button 是在 Designer 里“提升”的自定义控件,那么还要:

  • daqwidget.h#include 你的自定义控件头;
  • .ui 的 Promoted Widgets 面板里,确保 Header 指向正确路径
  • 重新构建后再试“转到槽”。

✅️问题延伸

  1. 为什么 Creator 会提示 Ui::Pictureshow_Button
    Creator 通过解析 #include "ui_*.h" 找到 namespace Ui { class <FormClass>; },再去检索 <FormClass> 内部的控件。如果没解析到这一步,就只能拿到控件的 objectName,误以为要找 “Ui::<objectName>”,从而报“找不到类”。

  2. 自动连接与命名规则
    Qt 的 自动连接机制按 on_<objectName>_<signal>() 签名匹配,无需手工连接。确保:

    • Q_OBJECT 存在;
    • 构造函数中调用了 ui->setupUi(this)
    • 函数签名与信号完全一致(参数个数、const & 等)。
  3. 多模块/子目录工程
    如果 UI 类在子库里生成,应用侧的 .cpp 没有包含正确的 ui_*.h,Creator 也会迷路。把“转到槽”的实现放在 拥有该 .ui 的类对应的 .cpp 中。

  4. 大小写、路径、编码问题
    在跨平台或多人协作中,.ui 大小写微差就会导致生成头名不一致,Windows 下编译也许过了,但 Creator 的索引器找不到;统一大小写可避免隐患。

✅️问题预测

  • 继续在“纯 .ui + 手写类”混用时,类名/大小写再度不一致会复现同类问题。
  • 如果迁移到 CMake/Qt6 而仍用旧的 qt5_wrap_ui,可能出现 ui 头不生成/路径不对 的问题。
  • 团队协作中,Promoted Widgets 的 Header 相对路径在不同机器上不一致,Creator 会再次报“找不到类”。

✅️小结

  1. 报错的根因是 Creator 找不到 Ui::<FormClass> ——通常因为 没包含 ui_*.h.ui 的 <class> 与 C++ 类名不匹配
  2. 头文件需要:Q_OBJECTnamespace Ui { class <FormClass>; }Ui::<FormClass>* ui;
  3. 源文件需要:#include "ui_<formfile>.h"ui->setupUi(this);
  4. 构建系统要包含 .ui(qmake: FORMS +=;CMake: qt_add_ui/列出 .ui)。重新配置+全量重建
  5. 直接写 on_Pictureshow_Button_clicked() 亦可,不依赖“转到槽”对话框。
  6. 若是提升控件,记得在 .h 和 .ui 的 Promoted 里都配置好头文件路径。
  7. 完成以上步骤后,“转到槽”即可正常定位并生成槽函数。

🌹 结语 & 互动说明

希望以上分析与解决思路,能为你当前的问题提供一些有效线索或直接可用的操作路径

若你按文中步骤执行后仍未解决:

  • 不必焦虑或抱怨,这很常见——复杂问题往往由多重因素叠加引起;
  • 欢迎你将最新报错信息、关键代码片段、环境说明等补充到评论区;
  • 我会在力所能及的范围内,结合大家的反馈一起帮你继续定位 👀

💡 如果你有更优或更通用的解法:

  • 非常欢迎在评论区分享你的实践经验或改进方案;
  • 你的这份补充,可能正好帮到更多正在被类似问题困扰的同学;
  • 正所谓「赠人玫瑰,手有余香」,也算是为技术社区持续注入正向循环

🧧 文末福利:技术成长加速包 🧧

  文中部分问题来自本人项目实践,部分来自读者反馈与公开社区案例,也有少量经由全网社区与智能问答平台整理而来。

  若你尝试后仍没完全解决问题,还请多一点理解、少一点苛责——技术问题本就复杂多变,没有任何人能给出对所有场景都 100% 套用的方案。

  如果你已经找到更适合自己项目现场的做法,非常建议你沉淀成文档或教程,这不仅是对他人的帮助,更是对自己认知的再升级。

  如果你还在持续查 Bug、找方案,可以顺便逛逛我专门整理的 Bug 专栏:《全栈 Bug 调优(实战版)》
这里收录的都是在真实场景中踩过的坑,希望能帮你少走弯路,节省更多宝贵时间。

✍️ 如果这篇文章对你有一点点帮助:

  • 欢迎给 bug菌 来个一键三连:关注 + 点赞 + 收藏
  • 你的支持,是我持续输出高质量实战内容的最大动力。

同时也欢迎关注我的硬核公众号 「猿圈奇妙屋」

获取第一时间更新的技术干货、BAT 等互联网公司最新面试真题、4000G+ 技术 PDF 电子书、简历 / PPT 模板、技术文章 Markdown 模板等资料,统统免费领取
你能想到的绝大部分学习资料,我都尽量帮你准备齐全,剩下的只需要你愿意迈出那一步来拿。

🫵 Who am I?

我是 bug菌:

  • 活跃于 CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等技术社区;
  • CSDN 博客之星 Top30、华为云多年度十佳博主、掘金多年度人气作者 Top40;
  • 掘金、InfoQ、51CTO 等平台签约及优质作者;
  • 全网粉丝累计 30w+

更多高质量技术内容及成长资料,可查看这个合集入口 👉 点击查看
硬核技术公众号 「猿圈奇妙屋」 期待你的加入,一起进阶、一起打怪升级。

- End -

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐