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 ;)