由于多个 *.ui 文件而导致的多个Ui_Dialog定义?
Multiple Ui_Dialog definitions due to multiple *.ui files?
我正在研究带有3.5英寸LCD屏幕的RaspberryPi。我有一个基于 Qt 5 的应用程序,它以没有标题栏的展台模式运行。该应用程序使用整个 320x480 屏幕。我正在尝试添加第二个对话框,当用户单击主对话框窗口中的按钮时显示该对话框。
每个对话框都是使用Qt Designer设计的。每个对话框都有一个*.ui
文件,用于设置对话框大小并添加一个按钮。*.ui
文件被 uic 或 moc 放入头文件和源文件中:
$g++ -c -pipe -g3 -O1 -O2 -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_UITOOLS_
LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/x86_64
-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtUiTools -isystem /us
r/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/
qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -isystem /usr/in
clude/libdrm -I. -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -o dialog1.o
dialog1.cpp
In file included from dialog2.h:7:0,
from dialog1.h:8,
from dialog1.cpp:1:
ui_dialog2.h:22:7: error: redefinition of ‘class Ui_Dialog’
class Ui_Dialog
^~~~~~~~~
In file included from dialog1.h:7:0,
from dialog1.cpp:1:
ui_dialog1.h:22:7: note: previous definition of ‘class Ui_Dialog’
class Ui_Dialog
^~~~~~~~~
In file included from dialog2.h:7:0,
from dialog1.h:8,
from dialog1.cpp:1:
ui_dialog2.h:50:11: error: redefinition of ‘class Ui::Dialog’
class Dialog: public Ui_Dialog {};
^~~~~~
In file included from dialog1.h:7:0,
from dialog1.cpp:1:
ui_dialog1.h:50:11: note: previous definition of ‘class Ui::Dialog’
class Dialog: public Ui_Dialog {};
^~~~~~
Makefile:445: recipe for target dialog1.o failed
make: *** [dialog1.o] Error 1
问题似乎是 *.ui 文件的翻译方式:
$ cat ui_dialog1.h | tail -n 7
namespace Ui {
class Dialog: public Ui_Dialog {};
} // namespace Ui
和:
$ cat ui_dialog2.h | tail -n 7
namespace Ui {
class Dialog: public Ui_Dialog {};
} // namespace Ui
我知道这个问题,但我不确定如何在Qt工具下解决它。这些工具需要为每个*.ui
文件使用唯一的命名空间或唯一的类名。
如何解决问题?
MCVE 可在 Noloader | qt-ui-dialog GitHub 上找到。MCVE 克隆
:git clone https://github.com/noloader/qt-ui-dialog
可以通过以下方式重现该问题:
cd qt-ui-dialog
make clean && qmake && make
ui_something.h标头必须包含在something.cpp源文件中,而不是something.h标头中。查看您的编译器输出,似乎您将ui_dialog1.h
包含在dialog1.h
中,这是错误的:将其包含在dialog1.cpp
中,而不是(同样适用于其他对话框(。
不过,请务必在标头中转发声明Ui
命名空间和类。在两个标头中,在对话框类声明之前添加以下行:
namespace Ui {
class Dialog;
}
这意味着您必须使用指向此Ui::Dialog
类的指针,因此它必须是:
class Dialog1 : public QDialog
{
/* ... */
private:
Ui::Dialog * ui;
};
并且,相应地:
Dialog1::Dialog1(QDialog *parent)
: QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
清理:
Dialog1::~Dialog1()
{
delete ui;
}
相关文章:
- 如何在MS Visual Studio 2019中运行QT UI
- 如何处理使用.ui文件生成的.h文件
- 根据变量使Qt UI中的复选框为已选中/未选中
- 一旦双簧管录制开始,主 UI 线程就会被阻止
- Qt Quick,如何更改 Ui 源代码?
- QWidget UI 在使用 QQuickWidget 时冻结
- 在 3ds Max 中更新进度条后,环境和效果 UI 不刷新
- Qt - QQuickWidget setSource without freezing UI
- MFC/C++ ComboBox:禁用下拉列表关闭和打开(UI 冻结)的绘制
- Qt5 ui,多个窗口:如何从窗口 1 访问窗口 2 中的 UI 对象
- QtConcurrent - 在发布到 UI 线程的数千个结果中保持 GUI 响应
- 发出信号以从线程更新 UI
- 更好的文本UI调试C++器,如python的pudb
- 可以在JSON文件的帮助下在Qt中创建UI表单
- 在 ui 文件中隐藏 QTabWidget 中的单个选项卡窗格?
- 由于多个 *.ui 文件而导致的多个Ui_Dialog定义?
- 如何将 .ui 完全转换为 C++ 头文件和源文件
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- 如何创建一个接口,允许我访问C++中的按钮(和其他ui)函数,该函数是使用python中的MFC实现的
- QThread::create running on UI Thread