我正在使用3.5英寸LCD屏幕的RaspberryPi 。我有一个基于Qt 5的应用程序,该应用程序在信息亭模式下运行,没有标题栏。该应用程序使用整个320x480屏幕。我试图添加第二个对话框,当用户单击主对话框窗口中的按钮时,该对话框将显示。
每个对话框都是使用Qt Designer设计的。每个对话框都有一个*.ui
设置对话框大小并添加按钮的文件。将该*.ui
文件微移或移动到头文件和源文件中:
$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
文件使用唯一的名称空间或唯一的类名称。
我该如何解决该问题?
Noloader提供了MCVE | 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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句