Qt移动插槽功能到另一个cpp文件

时间:2014-01-20 08:01:12

标签: c++ qt visual-c++ qt-creator slots

我有一个由Qt创建者制作的Qt项目。 我让创建者自己生成一个私有槽函数fx。 on_pushbutton_clicked()。 此函数在头文件中声明,函数本身位于Qt创建者创建的cpp文件中。 当我将函数从Qt creator生成的cpp文件移动到另一个cpp文件时(它在项目中添加,它与生成的cpp具有相同的包含)。 当我尝试编译它时,我得到lnk2019错误。 有没有办法在不同的文件中使用插槽功能? 我正在使用VC编译器。 好的,这是从代码中提取的。 (很长) gui.h

#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

当我尝试使用除gui.cpp以外的文件中的函数elipsy_button_clicked()进行编译时,它给出的错误代码

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

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

FIXED:项目忽略了该文件,再次运行qmake解决了问题。非常感谢答案:)

2 个答案:

答案 0 :(得分: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),我将像任何其他正常函数一样定义此函数。

所以在这种情况下一切都会正常工作。那能回答你的问题吗?

答案 1 :(得分: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
  3. (PS:Nice app :))