QT 5.5 setLayout() 通过返回值

QT 5.5 setLayout() by return value

本文关键字:返回值 setLayout QT      更新时间:2023-10-16

我正在尝试通过函数设置布局来设置小部件的布局,并且收到错误消息:

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。