У меня есть проект 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 снова решил проблему. Большое спасибо за ответы 🙂
Одна из проблем заключается в том, что вы экспортировали методы слота в elipsy.cpp
где в строке 14 вы пытаетесь использовать: ui
… который определен в ui_gui.h
включены только в gui.cpp
, но вперед объявлен в gui.h
(который вы включаете, конечно, в elipsy.cpp
), так что это должно дать вам ошибку компиляции. Решение: включить ui_gui.h
в elipsy.cpp. Если это не приводит к ошибке компиляции, попробуйте пересобрать приложение.
Во-вторых, ваш drand
функция определяется в gui.cpp
но не в любом заголовочном файле (легко исправить, изменить gui.h
) …
После исправления этих двух проблем компиляция прошла хорошо для меня.
Итак, несколько рекомендаций:
drand
(PS: Хорошее приложение :))
Обычно слоты объявляются в заголовочном файле, например, в моем 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), я определю эту функцию, как и любую другую обычную функцию.
Так что в этом случае все будет работать правильно. Это отвечает на ваш вопрос?