关于QT widget嵌套的问题

dongdetongxing 2015-08-20 02:20:54
由于本人原来是搞MFC,最近有个QT程序要搞,但是做的时候发现widget嵌套的时候,总是有问题,主要问题如下测试工程,请各位指教
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}
复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "widget1.h"
#include "widget2.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
mywidget1 = new widget1();
mywidget2 = new widget2();
ui->horizontalLayout->addWidget(mywidget1);
ui->horizontalLayout->addWidget(mywidget2);
}

MainWindow::~MainWindow()
{
delete ui;
}
复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class widget1;
class widget2;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

widget1 *mywidget1;
widget2 *mywidget2;
private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
复制代码
#ifndef WIDGET1_H
#define WIDGET1_H
#include "mainwindow.h"
#include <QWidget>


namespace Ui {
class widget1;
}
class widget1 : public QWidget
{
Q_OBJECT
public:
explicit widget1(QWidget *parent = 0);
~widget1();
signals:

public slots:

private:
Ui::widget1 *ui;
};

#endif // WIDGET1_H
复制代码
#ifndef WIDGET2_H
#define WIDGET2_H

#include <QWidget>
namespace Ui {
class widget2;
}
class widget2 : public QWidget
{
Q_OBJECT
public:
explicit widget2(QWidget *parent = 0);
~widget2();
signals:

public slots:


private:
Ui::widget2 *ui;
};

#endif // WIDGET2_H
复制代码

#include "widget1.h"

widget1::widget1(QWidget *parent) : QWidget(parent), ui(new Ui::widget1)
{
ui->setupUi(this);
}
widget1::~widget1()
{
delete ui;
}
复制代码
#include "widget2.h"

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

widget2::~widget2()
{
delete ui;
}
复制代码
我创建了一个基本主窗口,在主窗口中随意拖动了一个横向布局layout,然后在这个layout中拖进去并行放置了两个widget,然后创建了两个widget类,将这两个类对应到layout中的两个widget,编译的时候,发现与我正常项目中遇到的问题一模一样,invalid use of incomplete type 'class Ui::widget1',forward declaration of 'class Ui::widget1'请教各位我应该怎么改?
...全文
850 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqiang01234 2015-08-21
  • 打赏
  • 举报
回复
jiqiang01234 2015-08-21
  • 打赏
  • 举报
回复
widget1和widget2是通过Qt Creator的“设计师界面类”自动生成的吗?
dongdetongxing 2015-08-21
  • 打赏
  • 举报
回复
引用 1 楼 qt_dog 的回复:
mywidget1 = new widget1(this); mywidget2 = new widget2(this); Mainwindow的构造函数这么改试试
我现在最大的问题在于,直接编译都无法通过。报widget1和widget2 两个错误invalid use of incomplete type 'class Ui::widget1',forward declaration of 'class Ui::widget1',我查了下,感觉应该是自己对ui中子widget和程序中类的关联有问题。 想请教下,UI中的子widget和程序中的类一般是通过什么关联的。是不是我哪里比较不对
qt_dog 2015-08-21
  • 打赏
  • 举报
回复
Ui::MainWindow *ui;声明了一个UI类的实例, 构造函数中的 ui(new Ui::MainWindow)则创建了这个实例,ui->setupUi(this);这个函数可以理解为将ui中的子控件传给当前类。其他应该就是调用ui中的函数。 blog.csdn.net/songjinshi/article/details/7333119 这篇文章比较详细 以供参考。
qt_dog 2015-08-21
  • 打赏
  • 举报
回复
或者你可以直接把每个UI理解为一个特殊的UI类,其中的控件就是类中的私有成员,每个操作对应一个接口函数,这样理解感觉更好一些,而你建立 widget1和widget2过程中,并没有定义 Ui::widget1 和 Ui::widget2,就使用了这两个类
qt_dog 2015-08-21
  • 打赏
  • 举报
回复
引用 2 楼 dongdetongxing 的回复:
[quote=引用 1 楼 qt_dog 的回复:] mywidget1 = new widget1(this); mywidget2 = new widget2(this); Mainwindow的构造函数这么改试试
我现在最大的问题在于,直接编译都无法通过。报widget1和widget2 两个错误invalid use of incomplete type 'class Ui::widget1',forward declaration of 'class Ui::widget1',我查了下,感觉应该是自己对ui中子widget和程序中类的关联有问题。 想请教下,UI中的子widget和程序中的类一般是通过什么关联的。是不是我哪里比较不对[/quote] 你好,关于你的问题,我是这么认为的, Qt将UI与类结合在一起,当你在UI界面上操作,拖动控件或者设置参数时,UI自动将参数传递给类,当你在类中建立控件,设置布局等时,类也会将数据传给UI界面。
引用 2 楼 dongdetongxing 的回复:
[quote=引用 1 楼 qt_dog 的回复:] mywidget1 = new widget1(this); mywidget2 = new widget2(this); Mainwindow的构造函数这么改试试
我现在最大的问题在于,直接编译都无法通过。报widget1和widget2 两个错误invalid use of incomplete type 'class Ui::widget1',forward declaration of 'class Ui::widget1',我查了下,感觉应该是自己对ui中子widget和程序中类的关联有问题。 想请教下,UI中的子widget和程序中的类一般是通过什么关联的。是不是我哪里比较不对[/quote] 如果我理解没有错的话,你是没有建立UI界面?即(.ui)文件,你可以这么理解,ui文件就好比 txt文件,类的作用就是对txt进行相应的操作,你也可以在txt文件中直接操作。 你的错误应该是根本没有建立 Ui 文件,就进行操作,就好比没有txt文件,就进行读写一样。 其中 namespace Ui { class MainWindow; } 和 #include "ui_mainwindow.h",就是将Ui文件放到类中进行操作,类似将文件的句柄传递给函数一样。 希望能帮到你 记得给分~~
qt_dog 2015-08-20
  • 打赏
  • 举报
回复
mywidget1 = new widget1(this); mywidget2 = new widget2(this); Mainwindow的构造函数这么改试试

16,821

社区成员

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

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