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;
}
---------------------------------------
...全文
5123 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

16,212

社区成员

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

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