由于多个 *.ui 文件导致多个 Ui_Dialog 定义?

Multiple Ui_Dialog definitions due to multiple *.ui files?

我正在使用 3.5 inch LCD screen 开发 RaspberryPi。我有一个基于 Qt 5 的应用程序,它在没有标题栏的信息亭模式下运行。该应用程序使用整个 320x480 屏幕。我正在尝试添加第二个对话框,当用户单击主对话框上的按钮时显示该对话框 window。

每个对话框都是使用 Qt Designer 设计的。每个对话框都有一个 *.ui 文件,用于设置对话框大小并添加一个按钮。 *.ui 文件被 uic 或 moc 转换为 header 和源文件:

$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 文件使用唯一的命名空间或唯一的 class 名称。

我该如何解决这个问题?


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 header 必须包含在 something.cpp 源文件中,而不是在something.hheader。查看您的编译器输出,您似乎将 ui_dialog1.h 包含在 dialog1.h 中,这是错误的:将其包含在 dialog1.cpp 中(其他对话框同样适用)。

请务必在 header 中转发声明 Ui 命名空间和 class。在您的 header 中,在对话框 class 声明之前添加此行:

namespace Ui {
    class Dialog;
}

这意味着您必须使用指向此 Ui::Dialog class 的指针,因此它必须是:

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;
}