Witam,
Mam taki kod:
MainWindow.h

#ifndef _MAINWINDOW_H
#define _MAINWINDOW_H

#include "ui_MainWindow.h"
#include "Base.h"
#include <QFileDialog>
#include <QCloseEvent>
#include <QDesktopServices>

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    enum EditStrategy{automatic, manual};
    enum ToolbarVisibility{showToolbar, hideToolbar};
    enum ReturnedItemBehavior{keepReturnedItem, removeReturnedItem};
    enum ToolbarStyle{textOnly, iconOnly, textBeside, textUnder};

    MainWindow(Base *base_arg);
    virtual ~MainWindow();

    Ui::MainWindow* getWidgetPointer();
    QSqlTableModel* getModelPointer();
    void createWidgets();
    void setupModel();
    static void setEditStrategy(EditStrategy strategy);
    static void setToolbarVisibility(ToolbarVisibility visibility);
    static void setReturnedItemBehavior(ReturnedItemBehavior behavior);
    static void setToolbarStyle(ToolbarStyle style);
private:
    Ui::MainWindow widget;
    QSqlTableModel *model;
    Base *base;
    static EditStrategy editStrategy;
    static ToolbarVisibility toolbarVisibility;
    static ReturnedItemBehavior returnedItemBehavior;
    static ToolbarStyle toolbarStyle;
    
    void closeEvent(QCloseEvent *event);
    void configureToolbar();
    QString cutOutBaseName(QString path);
    void hideOrShowToolbar();
    void changeToolbarButtonStyle();
    
public slots:
    void showOpenDatabaseWindow();
    void enableWidgets();
    void disableWidgets();
    void disableOrEnableDeleteWidget(const QItemSelection & selected, const QItemSelection &deselected);
    void disableOrEnableReturnedWidget(const QItemSelection & selected, const QItemSelection &deselected);
    void updateTable();
    void updateModel();
    void deleteItem();
    void returnedItem();
    void deleteAllRecords();
    void setBaseNameOnWindowTitle();
    void setEmptyWindowTitle();
    void hideOrShowReturnedItems(int state);
    void updateWindow();
    void enableSaveWidget();
    void saveChanges();
    
signals:
    void openDatabase(QString);
    void exitProgram();
    void setReturnedOnBase(QString, int, QString, QString);
    void deleteAllRecordsSignal(QString);
};

#endif	/* _MAINWINDOW_H */

MainWindow.cpp

#include "MainWindow.h"

MainWindow::EditStrategy MainWindow::editStrategy;
MainWindow::ToolbarVisibility MainWindow::toolbarVisibility;
MainWindow::ReturnedItemBehavior MainWindow::returnedItemBehavior;
MainWindow::ToolbarStyle MainWindow::toolbarStyle;

MainWindow::MainWindow(Base *base_arg) {
    base = base_arg;
    model = 0;
}

MainWindow::~MainWindow() {
}

void MainWindow::createWidgets()
{
    widget.setupUi(this);
    configureToolbar();
}

void MainWindow::configureToolbar()
{
    hideOrShowToolbar();
    widget.toolBar->setMovable(false);
    widget.toolBar->addAction(widget.actionOpen_database);
    widget.toolBar->addAction(widget.actionNew_database);
    widget.toolBar->addAction(widget.actionSave_changes);
    widget.toolBar->addAction(widget.actionAdd_item);
    widget.toolBar->addAction(widget.actionDelete_item);
    widget.toolBar->addAction(widget.actionReturned);
}

void MainWindow::hideOrShowToolbar()
{
    if(toolbarVisibility == MainWindow::hideToolbar)
        widget.toolBar->setHidden(true);
    else
        widget.toolBar->setHidden(false);
}

void MainWindow::changeToolbarButtonStyle()
{
    if(toolbarStyle == MainWindow::iconOnly)
        widget.toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
    else if(toolbarStyle == MainWindow::textOnly)
        widget.toolBar->setToolButtonStyle(Qt::ToolButtonTextOnly);
    else if(toolbarStyle == MainWindow::textBeside)
        widget.toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    else
        widget.toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
}

Ui::MainWindow* MainWindow::getWidgetPointer()
{
    return &widget;
}

void MainWindow::showOpenDatabaseWindow()
{
    QString path = QFileDialog::getOpenFileName(this, trUtf8("Open database"), QDesktopServices::storageLocation(QDesktopServices::DataLocation),
                                                    trUtf8("qLender database (*.ldb)"));
    if(!path.isEmpty())
        emit openDatabase(path);
}

void MainWindow::enableWidgets()
{
    widget.actionAdd_item->setEnabled(true);
    widget.actionDelete_all_items->setEnabled(true);
    widget.tableView->setEnabled(true);
    widget.hideReturnedItemsCheckBox->setEnabled(true);
    setupModel();
}

void MainWindow::disableWidgets()
{
    widget.actionAdd_item->setDisabled(true);
    widget.actionDelete_all_items->setDisabled(true);
    widget.tableView->setDisabled(true);
    widget.hideReturnedItemsCheckBox->setCheckState(Qt::Unchecked);
    widget.hideReturnedItemsCheckBox->setDisabled(true);
    widget.actionSave_changes->setDisabled(true);
}

void MainWindow::closeEvent(QCloseEvent* event)
{
    emit exitProgram();
    event->accept();
}

void MainWindow::setupModel()
{
    if(model == 0)
    {
        model = new QSqlTableModel;
    }
    widget.tableView->setModel(model);
}

void MainWindow::updateTable()
{
    model->select();
}

void MainWindow::updateModel()
{
    model->setTable("lender");
    if(editStrategy == MainWindow::automatic)
        model->setEditStrategy(QSqlTableModel::OnFieldChange);
    else
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    
    if(!model->select())
    {
        disableWidgets();
        QMessageBox::critical(this, trUtf8("Broken file"), trUtf8("This file is broken. Please choose another file."));
        showOpenDatabaseWindow();
    }

    model->setHeaderData(1, Qt::Horizontal, trUtf8("Item"));
    model->setHeaderData(2, Qt::Horizontal, trUtf8("Person"));
    model->setHeaderData(3, Qt::Horizontal, trUtf8("Date of lend"));
    model->setHeaderData(4, Qt::Horizontal, trUtf8("Date of return"));


    widget.tableView->hideColumn(0);
}

void MainWindow::deleteItem()
{
    int row = widget.tableView->currentIndex().row();
    QMessageBox::StandardButton answer = QMessageBox::question(this, trUtf8("Confirm"), trUtf8("Do You really want to delete this item?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
    if(answer == QMessageBox::Yes)
        model->removeRow(row);
}

void MainWindow::disableOrEnableDeleteWidget(const QItemSelection & selected, const QItemSelection &deselected)
{
    if(selected.isEmpty())
        widget.actionDelete_item->setDisabled(true);
    else
        widget.actionDelete_item->setEnabled(true);
}

void MainWindow::disableOrEnableReturnedWidget(const QItemSelection& selected, const QItemSelection& deselected)
{
    if(selected.isEmpty())
        widget.actionReturned->setDisabled(true);
    else
        widget.actionReturned->setEnabled(true);
}

void MainWindow::returnedItem()
{
    if(returnedItemBehavior == MainWindow::removeReturnedItem)
        deleteItem();
    else
    {
        int row = widget.tableView->currentIndex().row();
        int id = model->record(row).field(0).value().toInt();
        emit setReturnedOnBase("lender", id, "return_date", "'"+QDate::currentDate().toString("yyyy-MM-dd")+"'"); //eg. date - 2012-01-01
    }
}

void MainWindow::deleteAllRecords()
{
    QMessageBox::StandardButton answer = QMessageBox::question(this, trUtf8("Confirm"), trUtf8("Do You really want to delete all items?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
    if(answer == QMessageBox::Yes)
        emit deleteAllRecordsSignal("lender");
}

QString MainWindow::cutOutBaseName(QString path)
{
    int namePosition = path.lastIndexOf("/");
    QString name = path.mid(namePosition+1, (path.length()-(namePosition+5))); //from last position of "/" (+ 1 - we want without "/") to extension (without dot)
    return name;
}

void MainWindow::setBaseNameOnWindowTitle()
{
    QString baseName = cutOutBaseName(base->getBaseName());
    setWindowTitle(baseName + " - qLender");
}

void MainWindow::setEmptyWindowTitle()
{
    setWindowTitle("qLender");
}

void MainWindow::hideOrShowReturnedItems(int state)
{
    if(state == 0)
        model->setFilter("");
    else
        model->setFilter("return_date = ''");

    //model->select();
}

void MainWindow::setEditStrategy(EditStrategy strategy)
{
    editStrategy = strategy;
}

void MainWindow::setToolbarVisibility(ToolbarVisibility visibility)
{
    toolbarVisibility = visibility;
}

void MainWindow::setReturnedItemBehavior(ReturnedItemBehavior behavior)
{
    returnedItemBehavior = behavior;
}

void MainWindow::setToolbarStyle(ToolbarStyle style)
{
    toolbarStyle = style;
}

void MainWindow::updateWindow()
{
    hideOrShowToolbar();
}

void MainWindow::enableSaveWidget()
{
    if(editStrategy == MainWindow::manual)
        widget.actionSave_changes->setEnabled(true);
}

QSqlTableModel* MainWindow::getModelPointer()
{
    return model;
}

void MainWindow::saveChanges()
{
    if(!model->submitAll())
        QMessageBox::critical(this, trUtf8("Error with database"), trUtf8("Changes cannot be updated."));
    else
        widget.actionSave_changes->setDisabled(true);
}

Niestety przy próbie kompilacji na Ubuntu (GCC 4.6.3 z repozytorium) wywala mi błędami:

MainWindow.o: In function `MainWindow':
/home/szymon/Bulidy projektów/qLender/../../Projekty/qLender/MainWindow.cpp:15: multiple definition of `MainWindow::editStrategy'
MainWindow.o:/home/szymon/Bulidy projektów/qLender/../../Projekty/qLender/MainWindow.cpp:15: first defined here

i to tak chyba dla każdej funkcji i zmiennej statycznej.

Z kolei na Windows (MinGW) wszystko kompiluje się bez problemów.

Czy ktoś wie co może być przyczyną?

EDIT:
Problem rozwiązany. Okazało się, że w pliku projektu Qt Creator (*pro) miałem dwa razy podany plik MainWindow.h oraz MainWindow.cpp ;)