QT разбиение проекта на несколько файлов

222
14 марта 2017, 15:43

Упростил код, дабы было легче разобраться с проблемой. Имеется класс, описанный в mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFormLayout>
#include <QLabel>
#include <QLineEdit>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void Menu1();
    void NZER_N_B(int &n);
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Функция NZER_N_B(int &n) должна быть реализована в отдельном .cpp файле ее вызов осуществляется в главном файле.

nzer_n_b.cpp:

#include "mainwindow.h"
void MainWindow::NZER_N_B(int &n)
{   
   n = 1770;
}

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pb1, SIGNAL(clicked(bool)), this, SLOT(Menu1()));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::Menu1()
{
    int n;
    NZER_N_B(n);
}

Но при такой реализации появляются ошибки LNK1120,2001,2019 (ссылка на неразрешенный элемент). Но если написать реализацию этой функции в заголовочном файле и соответственно подключить его. То ошибок нет, но так не правильно, насколько я знаю. Так вот, вопрос как засунуть реализацию кода в cpp и чтобы ошибок не возникало?

Answer 1

Надо понимать, как работает препроцессор. Когда он встречает директиву #include, он просто заменяет ее на код из указанного файла. Поэтому, если уж вам очень захотелось реализацию разбить на несколько пару файлов, то вам надо сделать следующее:

nzer_n_b.cpp:

void MainWindow::NZER_N_B(int &n)
{   
   n = 1770;
}

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pb1, SIGNAL(clicked(bool)), this, SLOT(Menu1()));
}
MainWindow::~MainWindow()
{
    delete ui;
}
// Можно и вначале файла, под всеми другими #include
// но тут, просто, для примера
#include "nzer_n_b.cpp"
void MainWindow::Menu1()
{
    int n;
    NZER_N_B(n);
}
Answer 2

Если все именно так как описано в примере, то проблем возникнуть не должно. Возможно после добавления файла не был вызван qmake для перегенерации Makefile'ов. Тогда нужно вызвать qmake из контектстного меню проекта, и пересобрать проект.

READ ALSO
fseek. Время работы

fseek. Время работы

ПриветУ меня стоит задача осуществлять многократное перемещение по файлу

269
Функции с переменным числом параметров - C++ [требует правки]

Функции с переменным числом параметров - C++ [требует правки]

Как обратиться к элементам в вызове функции, когда буду проверять, можно ли построить треугольник?

240
В чем ошибка отправлений данных через ajax?

В чем ошибка отправлений данных через ajax?

Всем доброго времени суток,отправляю ajax'ом id в таблицу на удаление,беру через инпутВыскакивает функция success,пишет,что все выполненоНО как...

240
валидация телефоного номера

валидация телефоного номера

написал код для валидации поля - мобильного телефона, но нашёл проблему, при заполнение например 12345 - работает отличтно, 1234п - выдает ошибку,...

216