Qt перемещение слотов в другой файл cpp

У меня есть проект Qt, созданный создателем Qt.
Я позволил самому создателю сгенерировать функцию приватных слотов fx. on_pushbutton_clicked ().
Эта функция объявлена ​​в заголовке, сама функция находится в файле cpp, созданном создателем Qt.
Когда я перемещаю функцию из файла cpp, сгенерированного создателем Qt, в другой файл 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 = appSOURCES += 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)" (?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

ИСПРАВЛЕНО: Файл был проигнорирован проектом, запуск qmake снова решил проблему. Большое спасибо за ответы 🙂

0

Решение

Одна из проблем заключается в том, что вы экспортировали методы слота в elipsy.cpp где в строке 14 вы пытаетесь использовать: ui … который определен в ui_gui.h включены только в gui.cpp, но вперед объявлен в gui.h (который вы включаете, конечно, в elipsy.cpp), так что это должно дать вам ошибку компиляции. Решение: включить ui_gui.h в elipsy.cpp. Если это не приводит к ошибке компиляции, попробуйте пересобрать приложение.

Во-вторых, ваш drand функция определяется в gui.cpp но не в любом заголовочном файле (легко исправить, изменить gui.h) …

После исправления этих двух проблем компиляция прошла хорошо для меня.

Итак, несколько рекомендаций:

  1. Оставьте вещи такими, какие они есть, когда придете к Qt … вы просто испортите себе голову, перемещая вещи вокруг.
  2. иметь отдельный «модуль» для утилит, таких как drand

(PS: Хорошее приложение :))

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), я определю эту функцию, как и любую другую обычную функцию.

Так что в этом случае все будет работать правильно. Это отвечает на ваш вопрос?

0

По вопросам рекламы [email protected]