找回密码
 立即注册
收起左侧

关于QT widget嵌套的问题

7
回复
11592
查看
[复制链接]
累计签到:6 天
连续签到:1 天
来源: 2015-8-20 11:17:20 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 ddtx 于 2015-8-20 14:18 编辑

我是QT新手,以前是做个MFC的,最近要改个QT的程序,所以一边学一边做。遇到个问题,网上找不到答案,过来问下。

我创建了一个widget,然后在UI中在这个widget中用多个layout进行了一系列布局,添加了一些控件,在其中一个layout中添加了一个子widget,编译调试,UI的运行结果与我预计一致,但是遇到一个问题,子widget显示不了内容。最开始我以为是子widget没有和UI关联,所以我就在子widget中用namespace添加了ui中widget的名称,构造函数和类中也有添加,然后编译无法通过,报错误是invalid use of incomplete type 'class Ui::plotcurve' 和 forward declaration of 'class Ui::plotcurve'其中plotcurve是layout中子widget的名称。由于刚用QT一周多,所以不是很明白,这个程序我应该是哪里有问题?
附件图片是我的UI文件中的布局,选中的部分就是我的子widget。

源码如下:
  1. drawCurve =new DrawCurve();
  2. ui->horizontalLayout->addWidget(drawCurve);
复制代码
这个是我在父widget中的初始化语句
  1. DrawCurve::DrawCurve(QWidget *parent) :
  2.     QWidget(parent)
  3.   ,ui(new Ui::plotcurve)
  4. {
  5.     ui->setupUi(this);

  6.     qDebug()<<"Run drawCurve init";
  7. }
复制代码
这个是子widgetC文件中构造和析构函数,父widget的ui头文件
  1. <div class="blockcode"><blockquote>#include "ui_variabletrackwidget.h"
  2. namespace Ui {
  3. class plotcurve;
  4. }
  5. private:
  6.      Ui::plotcurve *ui;
复制代码
请教各位,这个问题应该如何解决

最佳答案

查看完整内容

我大致好像看懂你的问题了,回答如下: 1.如果你在界面上拖拽了一个控件,就不要自己在去 new 了 2.如果你想使用自定义的控件有两种方式,第一种就是在代码里自己new然后添加到布局中,第二种方式就是使用你想表达的那种方法“然后创建了两个widget类,将这两个类对应到layout中的两个widget”,你想自定义后也通过拖拽的方式创建,这种方法也可以,这叫做“提升部件”,在这里就可以解释为你写好widget1和widget2类后,你到design ...
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2015-8-20 11:17:21 显示全部楼层
我大致好像看懂你的问题了,回答如下:
1.如果你在界面上拖拽了一个控件,就不要自己在去 new 了
2.如果你想使用自定义的控件有两种方式,第一种就是在代码里自己new然后添加到布局中,第二种方式就是使用你想表达的那种方法“然后创建了两个widget类,将这两个类对应到layout中的两个widget”,你想自定义后也通过拖拽的方式创建,这种方法也可以,这叫做“提升部件”,在这里就可以解释为你写好widget1和widget2类后,你到designer上拖拽两个widget到界面上,然后右键点击widget选择提升部件,按照提示填好,然后提升就可以了,如果不懂就再去百度Qt提升部件。。。
希望能够帮到你。。。
参与人数 1人气 +2 收起 理由
ddtx + 2 对我帮助很大!

查看全部评分总评分 : 人气 +2

回复

使用道具 举报

累计签到:118 天
连续签到:2 天
2015-8-20 11:44:46 显示全部楼层
//class B;
class A{  
B b;
};
class B{

};这样会报‘使用了未完成定义的类B,请前置声明B’。

你在父类前面申明下子类试试,你代码不全,我也只能猜猜是什么问题!

点评

我用两对分别的CPP和H文件实现了父widget和子widget,按道理CPP文件是没有编译顺序的,不是所有编译完成后进行链接,链接时才会检查外部声明吗?  发表于 2015-8-20 12:41
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-8-20 14:17:26 显示全部楼层
本帖最后由 ddtx 于 2015-8-20 14:19 编辑

鉴于问题比较麻烦,我创建了一个新的测试项目确定问题所在。如下。
  1. #include "mainwindow.h"
  2. #include <QApplication>

  3. int main(int argc, char *argv[])
  4. {
  5.     QApplication a(argc, argv);
  6.     MainWindow w;
  7.     w.show();

  8.     return a.exec();
  9. }
复制代码
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "widget1.h"
  4. #include "widget2.h"
  5. MainWindow::MainWindow(QWidget *parent) :
  6.     QMainWindow(parent),
  7.     ui(new Ui::MainWindow)
  8. {
  9.     ui->setupUi(this);
  10.     mywidget1 = new widget1();
  11.     mywidget2 = new widget2();
  12.     ui->horizontalLayout->addWidget(mywidget1);
  13.     ui->horizontalLayout->addWidget(mywidget2);
  14. }

  15. MainWindow::~MainWindow()
  16. {
  17.     delete ui;
  18. }
复制代码
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. class widget1;
  5. class widget2;

  6. namespace Ui {
  7. class MainWindow;
  8. }

  9. class MainWindow : public QMainWindow
  10. {
  11.     Q_OBJECT

  12. public:
  13.     explicit MainWindow(QWidget *parent = 0);
  14.     ~MainWindow();

  15.     widget1 *mywidget1;
  16.     widget2 *mywidget2;
  17. private:
  18.     Ui::MainWindow *ui;
  19. };

  20. #endif // MAINWINDOW_H
复制代码
  1. #ifndef WIDGET1_H
  2. #define WIDGET1_H
  3. #include "mainwindow.h"
  4. #include <QWidget>


  5. namespace Ui {
  6. class widget1;
  7. }
  8. class widget1 : public QWidget
  9. {
  10.     Q_OBJECT
  11. public:
  12.     explicit widget1(QWidget *parent = 0);
  13.        ~widget1();
  14. signals:

  15. public slots:

  16. private:
  17.     Ui::widget1 *ui;
  18. };

  19. #endif // WIDGET1_H
复制代码
  1. #ifndef WIDGET2_H
  2. #define WIDGET2_H

  3. #include <QWidget>
  4. namespace Ui {
  5. class widget2;
  6. }
  7. class widget2 : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     explicit widget2(QWidget *parent = 0);
  12.     ~widget2();
  13. signals:

  14. public slots:


  15. private:
  16.     Ui::widget2 *ui;
  17. };

  18. #endif // WIDGET2_H
复制代码

  1. #include "widget1.h"

  2. widget1::widget1(QWidget *parent) : QWidget(parent), ui(new Ui::widget1)
  3. {
  4. ui->setupUi(this);
  5. }
  6. widget1::~widget1()
  7. {
  8.    delete ui;
  9. }
复制代码
  1. #include "widget2.h"

  2. widget2::widget2(QWidget *parent) : QWidget(parent), ui(new Ui::widget2)
  3. {
  4. ui->setupUi(this);
  5. }

  6. widget2::~widget2()
  7. {
  8.     delete ui;
  9. }
复制代码
我创建了一个基本主窗口,在主窗口中随意拖动了一个横向布局layout,然后在这个layout中拖进去并行放置了两个widget,然后创建了两个widget类,将这两个类对应到layout中的两个widget,编译的时候,发现与我正常项目中遇到的问题一模一样,invalid use of incomplete type 'class Ui::widget1',forward declaration of 'class Ui::widget1'请教各位我应该怎么改?
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-8-21 10:09:30 显示全部楼层
一叶知秋 发表于 2015-8-21 09:32
我大致好像看懂你的问题了,回答如下:
1.如果你在界面上拖拽了一个控件,就不要自己在去 new 了
2.如果你 ...

谢谢,我就是想要你说这个意思,我去百度下,十分感谢。
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-8-21 10:14:04 显示全部楼层
一叶知秋 发表于 2015-8-21 09:32
我大致好像看懂你的问题了,回答如下:
1.如果你在界面上拖拽了一个控件,就不要自己在去 new 了
2.如果你 ...

另外,我想请教下,提升部件,我是直接在提升的类中实现函数就OK了,不需要new,也不需要其他任何需要和主窗口关联的操作,是这个意思吗?
不好意思,之前一直是MFC,有点不习惯QT的用法

点评

就和你拖一个其他标准控件是一样的,那就是一个类啊。。。  详情 回复 发表于 2015-8-21 13:01
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-8-21 10:21:09 显示全部楼层
一叶知秋 发表于 2015-8-21 09:32
我大致好像看懂你的问题了,回答如下:
1.如果你在界面上拖拽了一个控件,就不要自己在去 new 了
2.如果你 ...

问题已解决,谢谢你,十分感谢。
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2015-8-21 13:01:34 显示全部楼层
ddtx 发表于 2015-8-21 10:14
另外,我想请教下,提升部件,我是直接在提升的类中实现函数就OK了,不需要new,也不需要其他任何需要和 ...

就和你拖一个其他标准控件是一样的,那就是一个类啊。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了