QT 5.5 setLayout()的返回值

时间:2016-03-09 20:28:37

标签: c++ qt

我试图通过setLayout按函数设置小部件的布局,并且我会收到错误消息:

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

的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();
}

layoutmanager.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:\Qt\Tools\QtCreator\bin\jom.exe" 
    D:\Qt\Tools\QtCreator\bin\jom.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:debug\HM.exe @C:\Users\MICHA~1\AppData\Local\Temp\HM.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
debug\HM.exe : fatal error LNK1120: 2 unresolved externals
jom: D:\Qt\build-HM-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug\Makefile.Debug [debug\HM.exe] Error 1120
jom: D:\Qt\build-HM-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug\Makefile [debug] Error 2
21:18:33: The process "D:\Qt\Tools\QtCreator\bin\jom.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

3 个答案:

答案 0 :(得分:1)

我在.pro文件中添加了一些模块,比如多媒体,快速,小部件然后构建它并且它可以工作。我不知道它是如何工作的,因为在那之后我一个接一个地移除了当我没有这些模块而再次构建时它仍在工作。对我来说这似乎是一个错误(我在QTCreator中做了所有事情)或者我只是不明白编译器是如何工作的。

答案 1 :(得分:0)

看起来更像是链接命令的问题。您可以使用构建工具的link命令输出更新您的问题吗?您似乎缺少.cpp文件的对象文件,该文件提供了LayoutManager类的实现。

答案 2 :(得分:0)

一个。请检查包含setHelloLayout()和ctor的cpp文件的文件名,并将其与.pro文件中的内容进行比较。两个链接器错误都具有相同的类函数(并且所有需要的函数都失败了链接) - 这意味着类定义的CU不被拾取。

湾对于新添加/重命名的文件,qmake有时无法获取依赖关系(更糟糕的是,拒绝删除旧的中间体和链接到它们) - (即决定"配置不变 - 跳过qmake步骤"可能是错误的)。如果您最近重命名了文件/类,请进行干净的构建(删除mocs和对象文件)并再次运行qmake。