QT5编译报错 invalid use of incomplete type 'class Ui :: Widget'

ldysharon 2019-06-25 08:10:08


我按照书上说的做一个简单的销售车辆管理的界面,只做了一部分,编译报错invalid use of incomplete type 'class Ui :: Widget',请高手帮忙看看,应该不复杂,我是新手。卡在这里了。多谢多谢!

widget.h
-----------------------
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMenuBar>
#include <QMainWindow>

namespace Ui {
class Widget;
}

class Widget : public QMainWindow
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();
QMenu *salesMgtMenu;
QMenu *pwdMenu;

QAction *salesMgtAction;
QAction *chartAction;
QAction *quitAction;

private slots:
void on_salesMgtMenu_click();
void on_chartMenu_click();
void on_quitMenu_click();

private:
Ui::Widget *ui;
void createMenuBar();
};

void Widget::createMenuBar()
{
salesMgtAction = new QAction (tr("品牌车管理"),this);
chartAction = new QAction (tr("销售统计图表"),this);
quitAction = new QAction (tr("exit"),this);

salesMgtMenu = menuBar()->addMenu(tr("销售管理"));
salesMgtMenu ->addAction(salesMgtAction);
salesMgtMenu ->addAction(chartAction);
salesMgtMenu ->addAction(quitAction);

pwdMenu = menuBar()->addMenu(tr("修改密码"));

connect (salesMgtAction,SIGNAL(triggered()),this, SLOT(on_salesMgtMenu_click()));
connect (chartAction,SIGNAL(triggered()),this, SLOT(on_chartMenu_click()));
connect (quitAction,SIGNAL(triggered()),this, SLOT(on_quitMenu_click()));

}

void Widget::on_salesMgtMenu_click()
{
ui->stackedWidget->setCurrentIndex(0); //此处报错 invalid use of incomplete type 'class Ui :: Widget'

}


void Widget::on_chartMenu_click()
{
ui->stackedWidget->setCurrentIndex(1); //此处报错 invalid use of incomplete type 'class Ui :: Widget'

}

void Widget::on_quitMenu_click()
{
this->close();
}

#endif // WIDGET_H
-------------------------------------------


widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
createMenuBar();
}

Widget::~Widget()
{
delete ui;
}
---------------------------------------
...全文
8331 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldysharon 2019-07-15
  • 打赏
  • 举报
回复
非常感谢!牛人就是一下子解决了我的问题。:)
donwmufromdying 2019-07-08
  • 打赏
  • 举报
回复
引用 5 楼 ldysharon 的回复:
你说的很对,我把这几个成员函数挪到CPP里面就运行成功了。是不是因为CPP里面有#include "ui_widget.h"这句话? 但是我在widget.h里面后来也包含了#include "ui_widget.h"这句话,为啥运行还是出错,必须挪到CPP里面就可以了呢? 多谢! 是的,我不太熟悉C++, 学过,但是理解不深。
没事,谁都是一步步学起来的。你说的理解对了。QT会根据你的UI文件自动生成一个ui_xxx.h头文件。所以一般来说,c++有一种设计模式:为了减少重复引用,加快编译速度,头文件里尽量不要包含其他头文件。头文件包含能放在cpp里的都放在cpp。Qt缺省也是帮你把ui_xxx.h包含放在cpp里了。之所以你把ui_xxx.h放在头文件里还报错,那是因为你这么做就发生重复定义了。你得把头文件里的 namespace Ui {xxx}你不分删掉才会正确
ldysharon 2019-07-05
  • 打赏
  • 举报
回复
你说的很对,我把这几个成员函数挪到CPP里面就运行成功了。是不是因为CPP里面有#include "ui_widget.h"这句话? 但是我在widget.h里面后来也包含了#include "ui_widget.h"这句话,为啥运行还是出错,必须挪到CPP里面就可以了呢? 多谢! 是的,我不太熟悉C++, 学过,但是理解不深。
ldysharon 2019-07-01
  • 打赏
  • 举报
回复
你好,谢谢你的回答。 我按照你建议的,改成如下, 运行后开始的错误没有了,但出来了新的报错: multiple definition of ' Widget :: Widget::createMenuBar()" multiple definition of ' Widget::on_salesMgtMenu_click()" multiple definition of ' Widget::on_quitMenu_click()" 我后来删除了namespace, 改到了public定义UI,也是一样。 多谢指教! widget.h ----------------------------- #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QMenuBar> #include <QMainWindow> #include "ui_widget.h" namespace Ui { class Widget; } class Widget : public QMainWindow { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); QMenu *salesMgtMenu; QMenu *pwdMenu; QAction *salesMgtAction; QAction *chartAction; QAction *quitAction; private slots: void on_salesMgtMenu_click(); void on_chartMenu_click(); void on_quitMenu_click(); private: Ui::Widget *ui; void createMenuBar(); }; void Widget::createMenuBar() { salesMgtAction = new QAction (tr("品牌车管理"),this); chartAction = new QAction (tr("销售统计图表"),this); quitAction = new QAction (tr("exit"),this); salesMgtMenu = menuBar()->addMenu(tr("销售管理")); salesMgtMenu ->addAction(salesMgtAction); salesMgtMenu ->addAction(chartAction); salesMgtMenu ->addAction(quitAction); pwdMenu = menuBar()->addMenu(tr("修改密码")); connect (salesMgtAction,SIGNAL(triggered()),this, SLOT(on_salesMgtMenu_click())); connect (chartAction,SIGNAL(triggered()),this, SLOT(on_chartMenu_click())); connect (quitAction,SIGNAL(triggered()),this, SLOT(on_quitMenu_click())); } void Widget::on_salesMgtMenu_click() { ui->stackedWidget->setCurrentIndex(0); } void Widget::on_chartMenu_click() { ui->stackedWidget->setCurrentIndex(1); } void Widget::on_quitMenu_click() { this->close(); } #endif // WIDGET_H
donwmufromdying 2019-07-01
  • 打赏
  • 举报
回复
用namespace的方式是Qt缺省自动帮你做的,这种做法是Qt推荐的。相反,尽量不要用多继承。你的问题也不是因为namespace而产生的。我估计你对c++编程还是比较生疏的。你出的这个问题其实是c++的问题,和Qt没多大关系
donwmufromdying 2019-07-01
  • 打赏
  • 举报
回复
你把所有实现在widget.h中的成员函数挪到cpp里就可以了。因为你在头文件里用了Ui::Widget *ui;而在头文件里这个成员变量只是前向声明了,你的widget.h中因为没有包含ui_widget.h所以编译报错。而一般我们在widget.h中是不推荐包含ui_widget.h的
菠萝猫咪 2019-06-25
  • 打赏
  • 举报
回复 1
你的这个窗口是通过QtDesigner拖拽出来的吧,你没有把这个文件加载进去。假设你设计的这个窗口名称为mywidget,文件名称为mywidget.ui,那你需要在widget.h文件中添加#include "ui_mywidget.h"。而且不太建议你用namespace的方式,我一般按照下面这个用法使用ui文件 widget.h ----------------------- #ifndef WIDGET_H #define WIDGET_H //引用的头文件 #include "ui_mywidget.h" class Widget : public QMainWindow, public Ui_Mywidget { Q_OBJECT public: .......... Ui::Mywidget *ui; .......... } #endif
源码链接: https://pan.quark.cn/s/8ddf8a1c92f9 **libcurl用于获取大型文件**libcurl作为一个开源的C语言库,提供了一系列的API来处理与URL相关的任务,涵盖了HTTP、FTP、SMTP等多种网络协议的应用。在执行大型文件的下载操作时,libcurl展现出卓越的性能表现和高度的灵活性,能够高效地管理大文件传输过程,有效预防内存溢出及其他潜在问题。**libcurl的基础操作**libcurl的基础应用包括以下几个环节:1. **初始化**:需要借助`curl_global_init()`函数来启动libcurl的工作环境。2. **建立会话句柄**:通过`curl_easy_init()`函数创建一个会话句柄,该句柄将用于后续所有的操作流程。3. **配置选项**:运用`curl_easy_setopt()`函数来设定多种参数,例如目标URL、超时时间、重试次数以及数据写入的回调函数等。4. **执行请求**:调用`curl_easy_perform()`函数来实施下载操作。5. **释放资源**:使用`curl_easy_cleanup()`函数来释放已经占用的资源。**获取大型文件时的重要设置**1. **数据写入回调函数**:在处理大型文件下载时,通常不希望一次性将整个文件载入内存。可以配置`CURLOPT_WRITEFUNCTION`选项,指定一个回调函数来处理接收到的数据片段,这样libcurl在接收到数据时会调用该函数,使得我们可以按需将数据写入文件或缓冲区。2. **缓冲策略**:可以设定缓冲区的大小(比如,通过`CURLOPT_BUFFERSIZE`),来控制每次接收数据的数量,从而优化内存...
内容概要:本文档整合了《鬼谷子·决篇》与《三略·审权变第三》《差德行第四》三大古代智慧典籍,构建了一套“决策+形势+用人”三位一体的领导力提升体系。通过28天三合实战路径、三维诊断工具、9个实用模板及独特的“身体锚点”仪式,系统解决管理者在决策犹豫、形势误判、人岗错配等方面的痛点。全文涵盖理论溯源、方法论拆解(如三步决策法、审权变四步法、差德行四步法)、历史案例对照(范蠡 vs 项羽)以及跨资源联动建议,形成从认知到实践的完整闭环。; 适合人群:中基层管理者、创业者、职场进阶者,尤其是面临决策困境、环境适应困难或团队用人问题的人群;具备一定管理经验或自我提升意识的个体亦可受益。; 使用场景及目标:① 提升重大事项的决策质量,避免反复纠结与事后后悔;② 增强对外部环境变化的敏感度与应对能力,实现灵活调整;③ 科学评估人才德才素质,实现人岗精准匹配,减少用人失误;④ 构建个人化的决策-应变-用人标准化流程(SOP)。; 阅读建议:建议按照28天路径逐步实践,结合自测表定位短板,优先突破薄弱模块;配套工具模板需实际填写使用,配合身体锚点仪式强化行为记忆;可与“诸葛亮决策术”“立将威信术”等单品联动,全面提升领导力体系。

21,494

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧