问题来源:

我用MainWindow作为主界面,Dialog作为设置界面,还需要一个AboutDialog作为关于界面。

设置界面的Dialog头文件dialog.h是这样的:

  1. // dialog.h
  2. #ifndef DIALOG_H
  3. #define DIALOG_H
  4.  
  5. #include <QDialog>
  6.  
  7. namespace Ui {
  8. class Dialog;
  9. }
  10.  
  11. class Dialog : public QDialog
  12. {
  13. Q_OBJECT
  14.  
  15. public:
  16. explicit Dialog(QWidget *parent = 0);
  17. ~Dialog();
  18.  
  19. private slots:
  20. void ApplyConnect();
  21.  
  22. private:
  23. Ui::Dialog *ui;
  24. };
  25.  
  26. #endif // DIALOG_H

dialog.cpp文件如下:

  1. // dialog.cpp
  2. #include "dialog.h"
  3. #include "ui_dialog.h"
  4.  
  5. Dialog::Dialog(QWidget *parent) :
  6. QDialog(parent),
  7. ui(new Ui::Dialog)
  8. {
  9. ui->setupUi(this);
  10. connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(ApplyConnect()));
  11. }
  12.  
  13. Dialog::~Dialog()
  14. {
  15. delete ui;
  16. }
  17.  
  18. void Dialog::ApplyConnect()
  19. {
  20. //函数体
  21. }

我又新建了一个Dialog,ui对象命名为aboutDialog,头文件aboutdialog.h仿照上面Dialog的头文件:

  1. // aboutdialog.h
  2. #ifndef ABOUTDIALOG_H
  3. #define ABOUTDIALOG_H
  4.  
  5. #include <QDialog>
  6.  
  7. namespace Ui {
  8. class AboutDialog;
  9. }

  10. class AboutDialog : public QDialog
  11. {
  12. Q_OBJECT
  13. public:
  14. AboutDialog(QWidget *parent = 0);
  15. ~AboutDialog();
  16.  
  17. private:
  18. Ui::AboutDialog *ui;
  19.  
  20. private slots:
  21. void close();
  22.  
  23. };
  24.  
  25. #endif // ABOUTDIALOG_H

相应的,aboutdialog.cpp也仿照Dialog的cpp文件:

  1. // aboutdialog.cpp
  2. #include "aboutdialog.h"
  3. #include "ui_aboutdialog.h"
  4.  
  5. AboutDialog::AboutDialog(QWidget *parent) :
  6. QDialog(parent),
  7. ui(new Ui::AboutDialog)
  8. {
  9. ui->setupUi(this);
  10.  
  11. connect(ui->Close_pushButton, SIGNAL(clicked()),this, SLOT(close()));
  12. }
  13.  
  14. AboutDialog::~AboutDialog()
  15. {
  16. delete ui;
  17. }
  18.  
  19. //关闭
  20. void AboutDialog::close()
  21. {
  22. this->close();
  23. }

理论上,因为Dialog的头文件和cpp文件我是仿照MainWindow的相应文件修改而来的,没出现问题,料想新建两个Dialog也不会出现问题。

编译后:

后来上网查了很多资料都没有结果。

终于,还是发现点了苗头。我开始思考,ui文件是怎么和cpp文件耦合的?

首先,dialog.ui文件会自动生成一个ui_dialog.h的头文件,相应的,aboutdialog.ui也会生成ui_aboutdialog.h的头文件,在这个头文件中,定义了setupUi以及namespace继承这些内容。这些内容关乎到一下两处:

  1. namespace Ui {
  2. class AboutDialog;
  3. }
  4.  
  5. Ui::AboutDialog*ui;

这是ui_aboutdialog.h:

  1. /********************************************************************************
  2. ** Form generated from reading UI file 'aboutdialog.ui'
  3. **
  4. ** Created by: Qt User Interface Compiler version 5.2.1
  5. **
  6. ** WARNING! All changes made in this file will be lost when recompiling UI file!
  7. ********************************************************************************/
  8.  
  9. #ifndef UI_ABOUTDIALOG_H
  10. #define UI_ABOUTDIALOG_H
  11.  
  12. #include <QtCore/QVariant>
  13. #include <QtWidgets/QAction>
  14. #include <QtWidgets/QApplication>
  15. #include <QtWidgets/QButtonGroup>
  16. #include <QtWidgets/QDialog>
  17. #include <QtWidgets/QHeaderView>
  18. #include <QtWidgets/QPushButton>
  19.  
  20. QT_BEGIN_NAMESPACE
  21.  
  22. class Ui_aboutDialog
  23. {
  24. public:
  25. QPushButton *Close_pushButton;
  26.  
  27. void setupUi(QDialog *aboutDialog)
  28. {
  29. if (aboutDialog->objectName().isEmpty())
  30. aboutDialog->setObjectName(QStringLiteral("aboutDialog"));
  31. aboutDialog->resize(548, 479);
  32. Close_pushButton = new QPushButton(aboutDialog);
  33. Close_pushButton->setObjectName(QStringLiteral("Close_pushButton"));
  34. Close_pushButton->setGeometry(QRect(240, 370, 131, 41));
  35.  
  36. retranslateUi(aboutDialog);
  37.  
  38. QMetaObject::connectSlotsByName(aboutDialog);
  39. } // setupUi
  40.  
  41. void retranslateUi(QDialog *aboutDialog)
  42. {
  43. aboutDialog->setWindowTitle(QApplication::translate("aboutDialog", "Dialog", 0));
  44. Close_pushButton->setText(QApplication::translate("aboutDialog", "Close", 0));
  45. } // retranslateUi
  46.  
  47. };
  48.  
  49. namespace Ui {
  50. class aboutDialog: public Ui_aboutDialog {};
  51. } // namespace Ui
  52.  
  53. QT_END_NAMESPACE
  54.  
  55. #endif // UI_ABOUTDIALOG_H

如果出问题也应该是这里出问题。我已开始以为是namespace冲突问题,后来通过网上找资料发现:

ui文件会根据designer中Dialog的ObjectName来生成ui_xxx.h头文件。而ui_xxx.h又是搭在ui文件和cpp文件中间不可或缺的桥梁,因此,

必须将Designer中Dialog的ObjectName设置为相应的类名,才能在自动编译过程中正确衔接两个文件。

还值得一提的是,在aboutdialog.h中的namaspace声明也是可以去掉,如果声明出错也会导致冲突问题;

  1. #ifndef ABOUTDIALOG_H
  2. #define ABOUTDIALOG_H
  3.  
  4. #include <QDialog>
  5. #include "ui_aboutdialog.h" //新添项
  6.  
  7. /* 以下内容被新添项替换
  8. namespace Ui {
  9. class AboutDialog;
  10. }
  11. */
  12.  
  13. class AboutDialog : public QDialog
  14. {
  15. Q_OBJECT
  16. public:
  17. AboutDialog(QWidget *parent = 0);
  18. ~AboutDialog();
  19.  
  20. private:
  21. Ui::AboutDialog *ui;
  22.  
  23. };
  24.  
  25. #endif // ABOUTDIALOG_H

多么奇妙的问题,多么狗血的解决方式。花了我一天的时间才搞懂,而每次搞懂这些问题,对于这些知识就理解的更加透彻,这又是多么狗血的学习模式啊!!!

创建多个Dialog时,namespace冲突问题的解决 -- 基于QT 5.2的更多相关文章

  1. SVN更新或提交时出现冲突该如何解决

    解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲突解决,这样才能提交更新.冲突发生时,subversion会在WorkCopy中保存所有的目标文件版本(上 ...

  2. 创建Web项目运行时出小错误及解决方法

    1.目录结构 2.各文件内容 index.jsp <%@ page contentType="text/html;charset=UTF-8" language=" ...

  3. 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

    一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...

  4. EhCache WebCache 与 SpringMVC集成时 CacheManager冲突的问题

    转自:点击打开链接 http://www.cnblogs.com/daxin/p/3560989.html EhCache WebCache 与 SpringMVC集成时 CacheManager冲突 ...

  5. 解决jqplot与jquery-ui导入必要包时的冲突

    解决jqplot与jquery-ui导入必要包时的冲突 对于一个网页中,即要有jqplot的画图,又要有jquery-ui的风格显示! 但在导入必要的包时,出现了问题! 先导入jqplot的必要包: ...

  6. 使用Idea第一次创建一个Mavne工程时没有src目录

    在使用idea创建一个maven工程时没有src目录,可能出现的问题很多,我先把我自己的问题分享上来 因为没有src,可能是因为maven插件还没下载到本地仓库.maven插件的版本和jdk版本冲突或 ...

  7. Git 解决合并分支时的冲突

    参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344 创建分支时,新分支的文件内容建立在原分支的基础上,我们称这时 ...

  8. Visual Studio C# 利用git和github协同开发时产生冲突的解决办

    Visual Studio C# 利用git和Github协同开发时产生冲突的解决办法 前言:在前两天的助教作业中,发现了自己没有办法解决在用vs开发C#的窗体项目的过程中产生的冲突问题,在查阅了资料 ...

  9. 【Auto Layout】Xcode6及以上版本,创建Auto Layout 约束时产生的一些变化【iOS开发教程】

    [#Auto Layout#]Xcode6创建Auto Layout 约束时产生的一些变化     通过两个小Demo来展示下变化: Demo1需求: 为控制器的根视图(图中的“控制器View”)的子 ...

随机推荐

  1. 基于kerberos的hadoop安全集群搭建

    目录 前置条件 kerberos相关 给hadoop各组件创建kerberos账号 将这些账号做成keytab core-site.xml HDFS datanode的安全配置 证书生成和安装 hdf ...

  2. 如何提升springboot服务吞吐量

    生产环境偶尔会有一些慢请求导致系统性能下降,吞吐量下降,下面介绍几种优化建议. 方案 1.undertow替换tomcat 电子商务类型网站大多都是短请求,一般响应时间都在100ms,这时可以将web ...

  3. 十七、.net core(.NET 6)搭建基于Quartz组件的定时调度任务

     搭建基于Quartz组件的定时调度任务 先在package包项目下,添加Quartz定时器组件: 新建类库项目Wsk.Core.QuartzNet,并且引用包类库项目.然后新建一个中间调度类,叫Qu ...

  4. 详解apollo的设计与使用

    简介 apollo 是一款由携程团队开发的配置中心,可以实现配置的集中管理.分环境管理.即时生效等等.在这篇博客中,我们可以了解到: 为什么使用配置中心 如何设计一个配置中心 apollo 是如何设计 ...

  5. 树上染色+可怜与超市(树状DP)

    这两道题是学长精心准备的,想了很长时间,比较经典. 第一题 树上染色 有一棵点数为 N的树,树边有边权.给你一个在 0∼N之内的正整数 K,你要在这棵树中选择 K 个点,将其染成黑色,并将其他的 N− ...

  6. Java安全之反序列化回显研究

    Java安全之反序列化回显研究 0x00 前言 续上文反序列化回显与内存马,继续来看看反序列化回显的方式.上篇文中其实是利用中间件中存储的Request 和Response对象来进行回显.但并不止这么 ...

  7. webapi发布在iis之后报错Http 403.14 error

    服务器是 Windows Server 2008 R2 Enterprise 网上找了很多说是修改webconfig.试过之后没有效果,另外报错了. 最后才找到是因为webapi发布时选择的应用程序的 ...

  8. 解决 Golnag Gin框架跨域

    package main import ( "github.com/gin-gonic/gin" "awesomeProject/app/app_routers" ...

  9. Java实现单例模式的几种方式

    单例模式(Singleton),保证在程序运行期间,内存中只有一个实例对象. 饿汉式,最常用的方式.JVM加载类到内存中时,创建实例,线程安全. public class Boss { private ...

  10. MySQL 中存储时间的最佳实践

    平时开发中经常需要记录时间,比如用于记录某条记录的创建时间以及修改时间.在数据库中存储时间的方式有很多种,比如 MySQL 本身就提供了日期类型,比如 DATETIME,TIMESTAMEP 等,我们 ...