【发布时间】:2020-01-16 15:50:34
【问题描述】:
我正在尝试在项目中以不同方式使用自定义 Qt 对话框。有两种情况会出现同样的问题。
1.我将对话框作为库包含在主项目中。 该库是一个更大的 subdirs 项目的一部分,该项目还包含将使用它的主应用程序。这是项目树:
AppProject
|_AppProject.pro
|_MyApp
|_myapp.pro
|_main.cpp
|_mainwindow.h
|_mainwindow.cpp
|_mainwindow.ui
|_GUILib
|_guilib.pro
|_guilib_decl.h
|_somedialog.h
|_somedialog.cpp
|_somedialog.ui
这里的源文件:
main.cppmainwindow.hmainwindow.cpp
guilib_decl.hsomedialog.hsomedialog.cpp
somedialog.ui
AppProject 是一个普通的子目录项目,包括 MyApp 和 GUILib:
TEMPLATE = subdirs
SUBDIRS += MyApp \
GUILib
MyApp.depends = GUILib
MyApp 是一个普通的应用模板:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MyApp
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++14
DEPENDPATH += ../GUILib
INCLUDEPATH += ../GUILib
LIBS += -L../GUILib -lGUILib
HEADERS += mainwindow.h \
SOURCES += main.cpp \
mainwindow.cpp \
FORMS += mainwindow.ui \
这是 lib 项目文件:
QT += core widgets gui
TARGET = GUILib
TEMPLATE = lib
CONFIG += c++14
CONFIG -= debug_and_release
DEFINES += QT_DEPRECATED_WARNINGS
DEFINES += GUILIB_LIBRARY
HEADERS += \
guilib_decl.h \
somedialog.h
SOURCES += \
guilib.cpp \
somedialog.cpp
FORMS += \
somedialog.ui
该库可以自己构建(没问题,找到了ui_somedialog.h),但是如果我将somedialog.h 包含到mainwindow.h 中,那么编译器会吐出以下错误消息:
ui_somedialog.h: 没有这样的文件或目录
2。我将对话框作为非库包含在测试中。
这里的项目树如下所示:
AppProject
|_AppProject.pro
|_MyApp
|_myapp.pro
|_main.cpp
|_mainwindow.h
|_mainwindow.cpp
|_mainwindow.ui
|_somedialog.h
|_somedialog.cpp
|_somedialog.ui
|_Tests
|_tests.pro
|_main.cpp
|_tst_somedialog.cpp
它仍然是一个子目录项目,但这次其中一个是一个Test项目,对话框只是应用程序的一个普通部分(非lib)。
用于测试的项目文件如下所示:
QT += testlib
QT += widgets gui
TARGET = Tests
TEMPLATE = app
CONFIG += c++14
CONFIG += testcase
CONFIG -= debug_and_release
INCLUDEPATH += ../MyApp
SOURCES += main.cpp \
tst_somedialog.cpp \
不幸的是,对话框是否是库似乎并不重要,编译器在两种情况下都会显示相同的错误消息。最有趣的部分是,ui 文件在它应该在的位置(uic 完成了它的工作),所以理论上编译器应该在这两种情况下都找到它,但由于某种原因它没有。是否有一些我不知道的秘密使它起作用?为什么当我尝试在其他地方使用 ui_somedialog.h 时编译器看不到它?
谢谢。
编辑:修改为包含场景 2。
EDIT2:为场景 1 添加了源文件。
【问题讨论】:
-
带对话框的库?这是一个好方法吗..?
-
这只是一个概念。老实说,当我尝试在单元测试中使用对话框时,也发生了同样的问题。 ui_somedialog.h 如果没有在测试中使用,则找到,但另一方面,如果将其包含在测试中,则会出现相同的问题。我想如果我将要测试的对话框变成一个库(以及所有其他 gui 元素),问题就可以解决,但显然不是。这些问题似乎以某种方式相关。我想如果我找到了解决方案,测试问题也可以用同样的方式解决。
-
我们需要查看 somedialog.cpp 和 .h 中的代码才能说出问题所在。
-
为场景一添加了代码示例。它会产生帖子中提到的错误。
-
@pusrob 我已经给了你答案,不要从生成的代码继承,使用我在那里介绍的方法(私有成员指针)。这样您就不会暴露您的库“内部”,并减少为您的库导出的标头数量。
标签: c++ qt dialog shared-libraries qmake