创建多个Dialog时,namespace冲突问题的解决 -- 基于QT 5.2
问题来源:
我用MainWindow作为主界面,Dialog作为设置界面,还需要一个AboutDialog作为关于界面。
设置界面的Dialog头文件dialog.h是这样的:
// dialog.h
#ifndef DIALOG_H
#define DIALOG_H #include <QDialog> namespace Ui {
class Dialog;
} class Dialog : public QDialog
{
Q_OBJECT public:
explicit Dialog(QWidget *parent = 0);
~Dialog(); private slots:
void ApplyConnect(); private:
Ui::Dialog *ui;
}; #endif // DIALOG_H
dialog.cpp文件如下:
// dialog.cpp
#include "dialog.h"
#include "ui_dialog.h" Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(ApplyConnect()));
} Dialog::~Dialog()
{
delete ui;
} void Dialog::ApplyConnect()
{
//函数体
}
我又新建了一个Dialog,ui对象命名为aboutDialog,头文件aboutdialog.h仿照上面Dialog的头文件:
// aboutdialog.h
#ifndef ABOUTDIALOG_H
#define ABOUTDIALOG_H #include <QDialog> namespace Ui {
class AboutDialog;
}
class AboutDialog : public QDialog
{
Q_OBJECT
public:
AboutDialog(QWidget *parent = 0);
~AboutDialog(); private:
Ui::AboutDialog *ui; private slots:
void close(); }; #endif // ABOUTDIALOG_H
相应的,aboutdialog.cpp也仿照Dialog的cpp文件:
// aboutdialog.cpp
#include "aboutdialog.h"
#include "ui_aboutdialog.h" AboutDialog::AboutDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::AboutDialog)
{
ui->setupUi(this); connect(ui->Close_pushButton, SIGNAL(clicked()),this, SLOT(close()));
} AboutDialog::~AboutDialog()
{
delete ui;
} //关闭
void AboutDialog::close()
{
this->close();
}
理论上,因为Dialog的头文件和cpp文件我是仿照MainWindow的相应文件修改而来的,没出现问题,料想新建两个Dialog也不会出现问题。
编译后:
后来上网查了很多资料都没有结果。
终于,还是发现点了苗头。我开始思考,ui文件是怎么和cpp文件耦合的?
首先,dialog.ui文件会自动生成一个ui_dialog.h的头文件,相应的,aboutdialog.ui也会生成ui_aboutdialog.h的头文件,在这个头文件中,定义了setupUi以及namespace继承这些内容。这些内容关乎到一下两处:
namespace Ui {
class AboutDialog;
} Ui::AboutDialog*ui;
这是ui_aboutdialog.h:
/********************************************************************************
** Form generated from reading UI file 'aboutdialog.ui'
**
** Created by: Qt User Interface Compiler version 5.2.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/ #ifndef UI_ABOUTDIALOG_H
#define UI_ABOUTDIALOG_H #include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QDialog>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QPushButton> QT_BEGIN_NAMESPACE class Ui_aboutDialog
{
public:
QPushButton *Close_pushButton; void setupUi(QDialog *aboutDialog)
{
if (aboutDialog->objectName().isEmpty())
aboutDialog->setObjectName(QStringLiteral("aboutDialog"));
aboutDialog->resize(548, 479);
Close_pushButton = new QPushButton(aboutDialog);
Close_pushButton->setObjectName(QStringLiteral("Close_pushButton"));
Close_pushButton->setGeometry(QRect(240, 370, 131, 41)); retranslateUi(aboutDialog); QMetaObject::connectSlotsByName(aboutDialog);
} // setupUi void retranslateUi(QDialog *aboutDialog)
{
aboutDialog->setWindowTitle(QApplication::translate("aboutDialog", "Dialog", 0));
Close_pushButton->setText(QApplication::translate("aboutDialog", "Close", 0));
} // retranslateUi }; namespace Ui {
class aboutDialog: public Ui_aboutDialog {};
} // namespace Ui QT_END_NAMESPACE #endif // UI_ABOUTDIALOG_H
如果出问题也应该是这里出问题。我已开始以为是namespace冲突问题,后来通过网上找资料发现:
ui文件会根据designer中Dialog的ObjectName来生成ui_xxx.h头文件。而ui_xxx.h又是搭在ui文件和cpp文件中间不可或缺的桥梁,因此,
必须将Designer中Dialog的ObjectName设置为相应的类名,才能在自动编译过程中正确衔接两个文件。
还值得一提的是,在aboutdialog.h中的namaspace声明也是可以去掉,如果声明出错也会导致冲突问题;
#ifndef ABOUTDIALOG_H
#define ABOUTDIALOG_H #include <QDialog>
#include "ui_aboutdialog.h" //新添项 /* 以下内容被新添项替换
namespace Ui {
class AboutDialog;
}
*/ class AboutDialog : public QDialog
{
Q_OBJECT
public:
AboutDialog(QWidget *parent = 0);
~AboutDialog(); private:
Ui::AboutDialog *ui; }; #endif // ABOUTDIALOG_H
多么奇妙的问题,多么狗血的解决方式。花了我一天的时间才搞懂,而每次搞懂这些问题,对于这些知识就理解的更加透彻,这又是多么狗血的学习模式啊!!!
创建多个Dialog时,namespace冲突问题的解决 -- 基于QT 5.2的更多相关文章
- SVN更新或提交时出现冲突该如何解决
解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲突解决,这样才能提交更新.冲突发生时,subversion会在WorkCopy中保存所有的目标文件版本(上 ...
- 创建Web项目运行时出小错误及解决方法
1.目录结构 2.各文件内容 index.jsp <%@ page contentType="text/html;charset=UTF-8" language=" ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- EhCache WebCache 与 SpringMVC集成时 CacheManager冲突的问题
转自:点击打开链接 http://www.cnblogs.com/daxin/p/3560989.html EhCache WebCache 与 SpringMVC集成时 CacheManager冲突 ...
- 解决jqplot与jquery-ui导入必要包时的冲突
解决jqplot与jquery-ui导入必要包时的冲突 对于一个网页中,即要有jqplot的画图,又要有jquery-ui的风格显示! 但在导入必要的包时,出现了问题! 先导入jqplot的必要包: ...
- 使用Idea第一次创建一个Mavne工程时没有src目录
在使用idea创建一个maven工程时没有src目录,可能出现的问题很多,我先把我自己的问题分享上来 因为没有src,可能是因为maven插件还没下载到本地仓库.maven插件的版本和jdk版本冲突或 ...
- Git 解决合并分支时的冲突
参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344 创建分支时,新分支的文件内容建立在原分支的基础上,我们称这时 ...
- Visual Studio C# 利用git和github协同开发时产生冲突的解决办
Visual Studio C# 利用git和Github协同开发时产生冲突的解决办法 前言:在前两天的助教作业中,发现了自己没有办法解决在用vs开发C#的窗体项目的过程中产生的冲突问题,在查阅了资料 ...
- 【Auto Layout】Xcode6及以上版本,创建Auto Layout 约束时产生的一些变化【iOS开发教程】
[#Auto Layout#]Xcode6创建Auto Layout 约束时产生的一些变化 通过两个小Demo来展示下变化: Demo1需求: 为控制器的根视图(图中的“控制器View”)的子 ...
随机推荐
- 理解Spring:AOP的原理及手动实现
引入 到目前为止,我们已经完成了简易的IOC和DI的功能,虽然相比如Spring来说肯定是非常简陋的,但是毕竟我们是为了理解原理的,也没必要一定要做一个和Spring一样的东西.到了现在并不能让我们松 ...
- Linux命令大全之挂载命令
理解:Linux挂载相当于Windows分配盘符 1.查询系统中已挂载的设备 mount 2.设置自动挂载 编辑文件/etc/fstab,把文件写入就可以启动自动挂载了, 注:一般不把光盘写入,如果写 ...
- Linux命令大全之搜索命令
文件搜索命令(只能搜索文件) locate 文件名 在后台数据库中按文件名搜索,搜索速度快 /var/lib/mlocate(locate文件数据库) 这个数据库默认一天更新一次,强制 ...
- winform/WPF 多语言的实现
WPF实现起来非常现代化,可以参考 https://www.cnblogs.com/yang-fei/p/4854460.html winform主要说一下实现过程和注意点,实现参考AutoUpdat ...
- .NET Core/.NET5/.NET6 开源项目汇总7:电商项目
系列目录 [已更新最新开发文章,点击查看详细] 谈起.NET/.NET Core的企业级实战案例,电商项目是典型代表.其中高负载.高并发.高可用性等问题是考核.NET技术性能的重要指标.下面整 ...
- SpringBoot数据访问(三) SpringBoot整合Redis
前言 除了对关系型数据库的整合支持外,SpringBoot对非关系型数据库也提供了非常好的支持,比如,对Redis的支持. Redis(Remote Dictionary Server,即远程字典服务 ...
- CSS3转换(transform)基本用法介绍
一个炫酷的网页离不开css的transform.transition.animation三个属性,之前一直没有涉及到这块内容,刚好最近要做一个相关东西,趁此机会好好学一学这三个属性. 一.功能 实现元 ...
- string转char*/char[]
转char* 主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy(); 1.data() data()仅返回字符串内容,而不含有结束符'\0' std: ...
- Octal Fractions java秒 C++
Octal Fractions 题目抽象: 将八进制小数转换成十进制小树.小数的为数很大. 可以用java 中的BigDeciaml 秒掉. time:297ms 1 import java. ...
- LVS-NAT模式的实现
一.架构如下: 二.安装过程 1.配置"互联网"服务器 1.1.修改服务器ip为192.168.10.101/24 [root@internet ~]# ip a 1: lo: & ...