QT 5.5 setLayout() 通过返回值
QT 5.5 setLayout() by return value
我正在尝试通过函数设置布局来设置小部件的布局,并且收到错误消息:
main.obj:-1: error: LNK2019: unresolved external symbol "public: __cdecl LayoutManager::LayoutManager(void)" (??0LayoutManager@@QEAA@XZ) referenced in function main
main.obj:-1: error: LNK2019: unresolved external symbol "public: class QVBoxLayout * __cdecl LayoutManager::setHelloLayout(void)" (?setHelloLayout@LayoutManager@@QEAAPEAVQVBoxLayout@@XZ) referenced in function main
主.cpp
int main(int argc, char *argv[]){
QApplication app(argc, argv);
MainWindow mWin; //main widget
LayoutManager *LayMan = new LayoutManager();
mWin.setLayout(LayMan->setHelloLayout());
mWin.show();
return app.exec();
}
布局管理器.h
class LayoutManager : public MainWindow
{
Q_OBJECT
void (*set_Lo_Pt[LAST_LAYOUT])(MainWindow&);
public:
LayoutManager();
~LayoutManager();
QVBoxLayout* setHelloLayout();
};
这是setHelloLayout()函数
QVBoxLayout* LayoutManager::setHelloLayout(){
QVBoxLayout *menuOptions = new QVBoxLayout();
QPushButton *but_HouseManager = new QPushButton("HouseManager");
QPushButton *but_Help = new QPushButton("Help");
QPushButton *but_Quit = new QPushButton("Quit");
menuOptions->addWidget(but_HouseManager);
menuOptions->addWidget(but_Help);
menuOptions->addWidget(but_Quit);
return menuOptions;
}
类 MainWindow 派生自 QWidget
是功能体问题还是我应该更改整个布局更改系统?
这是编译输出
21:18:33: Running steps for project HM...
21:18:33: Configuration unchanged, skipping qmake step.
21:18:33: Starting: "D:QtToolsQtCreatorbinjom.exe"
D:QtToolsQtCreatorbinjom.exe -f Makefile.Debug
link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST:embed /OUT:debugHM.exe @C:UsersMICHA~1AppDataLocalTempHM.exe.4644.15.jom
main.obj : error LNK2019: unresolved external symbol "public: __cdecl LayoutManager::LayoutManager(void)" (??0LayoutManager@@QEAA@XZ) referenced in function main
main.obj : error LNK2019: unresolved external symbol "public: class QVBoxLayout * __cdecl LayoutManager::setHelloLayout(void)" (?setHelloLayout@LayoutManager@@QEAAPEAVQVBoxLayout@@XZ) referenced in function main
debugHM.exe : fatal error LNK1120: 2 unresolved externals
jom: D:Qtbuild-HM-Desktop_Qt_5_5_1_MSVC2013_64bit-DebugMakefile.Debug [debugHM.exe] Error 1120
jom: D:Qtbuild-HM-Desktop_Qt_5_5_1_MSVC2013_64bit-DebugMakefile [debug] Error 2
21:18:33: The process "D:QtToolsQtCreatorbinjom.exe" exited with code 2.
Error while building/deploying project HM (kit: Desktop Qt 5.5.1 MSVC2013 64bit)
When executing step "Make"
21:18:33: Elapsed time: 00:00.
这是 .pro 文件
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = HM
TEMPLATE = app
SOURCES += main.cpp
mainwindow.cpp
layoutmanager.cpp
HEADERS += mainwindow.h
layoutmanager.h
我在 .pro 文件中添加了一些模块,如多媒体、快速、小部件,然后构建它并且可以工作。我不知道它是如何工作的,因为在那之后我一个接一个地删除了,当我再次在没有这些模块的情况下构建时,它仍然在工作。这对我来说似乎是一个错误(我正在 QTCreator 中做所有事情),或者我只是不明白编译器究竟是如何工作的。
看起来更像是链接命令的问题。您可以使用构建工具的 link 命令输出更新您的问题吗?您似乎缺少提供LayoutManager
类实现的.cpp文件的对象文件。
a.请检查包含 setHelloLayout() 和 ctor 的 cpp 文件的文件名 - 并将其与 .pro 文件中的内容进行比较。两个链接器错误都与同一类的函数有关(并且所有需要的函数都无法链接) - 这意味着不会选取类定义的 CU。
二.对于新添加/重命名的文件,qmake 有时无法获取依赖项(更糟糕的是,拒绝删除旧的中间体和指向它们的链接) - (即"配置未更改 - 跳过 qmake 步骤"的决定可能是错误的)。如果您最近重命名了文件/类,请进行干净的构建(删除mocs和对象文件)并再次运行qmake。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 使用 std::p air 进行返回值优化
- QT 5.5 setLayout() 通过返回值