2014-01-20 52 views
0

我有Qt Creator中取得了Qt工程。 我让创作者本身产生一个私有槽函数FX。 on_pushbutton_clicked()。 此功能在头部声明,函数本身是由Qt Creator中创建cpp文件。 当我移动通过Qt Creator中产生的另一个CPP文件(这是在项目补充说,它已同包括所生成的CPP。 当我尝试编译它,我得到LNK2019错误CPP文件中的函数。 是有什么办法可以有缝隙的功能在不同的文件? 我使用VC编译。 好了,这是从代码提取物。(这是相当长) gui.hQt的移动插槽功能到另一个CPP文件

#ifndef GUI_H 
#define GUI_H 

#include <QMainWindow> 
#include "buffer.h" 
#include <string> 
#include <map> 
#include <math.h> 
#include <sstream> 
#include <stdlib.h> 
#include "qcustomplot.h" 
#include <limits> 
#include <time.h> 
#include <random> 


namespace Ui { 
class GUI; 
} 

class GUI : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit GUI(QWidget *parent = 0); 
    ~GUI(); 
private slots: 

    void on_setall_clicked(); 

    void on_integrace_button_clicked(); 
    void on_elipsy_button_clicked(); 
    void on_grafy_button_clicked(); 

private: 
    Ui::GUI *ui; 



}; 
#endif // GUI_H 

gui.cpp

#include "gui.h" 
#include "ui_gui.h" 

double drand(double from, double to){ 
    double f = (double)rand()/RAND_MAX; 
    return from + f * (to - from); 
} 

GUI::GUI(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::GUI) 
{ 
    ui->setupUi(this); 
    srand(time(0)); 
} 

GUI::~GUI() 
{ 
    delete ui; 
} 
void GUI::on_setall_clicked(){...}; 
void GUI::on_grafy_button_clicked(){...}; 
void GUI::on_integrace_button_clicked(){...}; 

elipsy.cpp

#include "gui.h" 
void GUI::on_elipsy_button_clicked(){...}; 

GUI.pro

#------------------------------------------------- 
# 
# Project created by QtCreator 2013-03-27T09:01:31 
# 
#------------------------------------------------- 

QT  += core gui 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport 

TARGET = GUI 
TEMPLATE = app 


SOURCES += main.cpp\ 
     gui.cpp \ 
    solve_rpn.cpp \ 
    shunting_yard.cpp \ 
    qcustomplot.cpp \ 
    elipsy.cpp \ 
    grafy.cpp \ 
    integrace.cpp 

HEADERS += gui.h \ 
    buffer.h \ 
    qcustomplot.h 

FORMS += gui.ui 

和错误代码,它给了我,当我尝试用elipsy_button_clicked函数编译()比其他gui.cpp文件

moc_gui.obj:-1: Chyba:LNK2019: unresolved external symbol "private: void __cdecl GUI::on_elipsy_button_clicked(void)" ([email protected]@@AEAAXXZ) referenced in function "private: static void __cdecl GUI::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@[email protected]@@[email protected]) 
debug\GUI.exe:-1: Chyba:LNK1120: 1 unresolved externals 

好,如果你需要整个源代码,我上传了它 http://seed.gweana.eu/public/GUI.7z

F IXED:该文件被项目忽略,运行qmake再次解决了这个问题。您的答案:)

+0

它很难告诉你做什么,你真的需要张贴代码所以我们可以看看。你基本上需要像为普通的C++类那样去做。 –

+1

请向我们显示您的代码 –

+0

请显示确切的错误信息。 – hyde

回答

0

其中的一个问题是,你导出的插槽方法elipsy.cpp,其中第14行试图使用:ui ...它被定义在ui_gui.h包括只在gui.cpp,但在gui.h前锋声明(你当然包括在elipsy.cpp)所以这应该会给你一个编译错误。解决方案:在elipsy.cpp中包含ui_gui.h。如果它不给你一个编译错误尝试重建应用程序。

其次,你drand功能在gui.cpp定义,但没有在任何头文件(很容易可以解决的,修改gui.h)...

修复这两个问题汇编是好的,我后。

因此,一些建议:

  1. 保留东西,因为他们的时候......你只会弄乱你的头走动的事情,当涉及到Qt的。
  2. 对公用事业一个独立的“模块”,如drand

(PS:尼斯应用:))

+0

1)这不是一个真正的问题,UI本身是类GUI的一部分,所以不需要包含ui_gui.h 2)是的,这将是一个问题,修复了这个问题 最后,对于这个问题,编译器忽略了elipsy .cpp没有mather我做了什么。运行qmake再次解决了我的问题...编译的文件,我没有更多的错误。 – Gweana

0

一般插槽在头文件中声明的一样,在我的Counter.h非常感谢:

#include <QObject> 

    class Counter : public QObject 
    { 
    Q_OBJECT 

    public: 
    Counter() { m_value = 0; } 

    int value() const { return m_value; } 

    public slots: 
    void setValue(int value); 
.... 

现在Counter.cpp(而且必须包括Counter.h)我会像任何其他正常的函数一样定义这个函数。

因此,在这种情况下,一切都会correctly.Does,回答你的问题?

相关问题