Здравствуйте. Я пишу небольшую программку для работы с заметками. Сейчас реализован минимальный функционал: заметку можно создать, отредактировать и удалить. Для GUI у меня Qt, база - SQLite. В общем, всё работает и делает то, что я хочу. Но опыт программирования у меня стремится к нулю, поэтому подозреваю, что есть много недочетов, которые я не могу исправить, потому что не знаю, куда смотреть. Хотелось бы, чтобы вы указали на все ошибки/проблемы/недостатки, которые бросаются в глаза. Интересует всё от логики разделения на классы до возможных утечек памяти.
Сейчас есть по сути 12 классов:
MattyNotesMainWindow
, MattySettingsDialog
, addNoteDialog
, MattyMessageBox
DbManager
QueryConstructor
MattyNote
MattyGroupBox
NoteHolder
MattyStyleSheetEditor
Constants
MattyClocks
Я понимаю, что вряд ли кто-то станет вычитывать весь код, поэтому, может быть, вы сможете посмотреть на классы и их методы и сказать, что лишнее, или посмотреть на какой-нибудь один класс и указать на недостатки в нем.
Например, функции подключения к базе, редактирования существующей заметки и извечения всех заметок из базы:
bool DbManager::connect(const QString & path)
{
MattyNotesDb = QSqlDatabase::addDatabase("QSQLITE");
MattyNotesDb.setDatabaseName(path);
if(QFile::exists(path))
{
if (!MattyNotesDb.open())
{
showIsNotOpenedError();
MattyNotesDb.close();
return false;
}
else
{
PathToDb = MattyNotesDb.databaseName();
}
return true;
}
else
{
return false;
}
}
bool DbManager::editNote(MattyNote & Note, int NoteId)
{
if (connected())
{
QueryConstructor Edit;
Edit.setTableName(QStringLiteral("Notes"));
Edit.addWhereFieldValue(QStringLiteral("NoteId"), QString::number(NoteId));
QMap<QString, QString> NoteTemp;
NoteTemp["NoteTitle"] = "\'" + Note.getTitle() + "\'";
NoteTemp["NoteType"] = "\'" + Note.getType() + "\'";
NoteTemp["NoteText"] = "\'" + Note.getText() + "\'";
NoteTemp["EventTime"] = "\'" + Note.getEventTime() + "\'";
NoteTemp["EventDate"] = "\'" + Note.getEventDate() + "\'";
NoteTemp["CrTime"] = "\'" + Note.getCrTime() + "\'";
NoteTemp["CrDate"] = "\'" + Note.getCrDate() + "\'";
NoteTemp["TypeId"] = QString::number(Note.getTypeId());
Edit.setWhatToSetFieldValue(NoteTemp); //
QSqlQuery editNoteQuery;
return editNoteQuery.exec(Edit.constructUpdateQuery());
}
else
{
return false;
}
}
QVector<MattyNoteRow> DbManager::showNotes()
{
if (connected())
{
QVector<MattyNoteRow> VectorOfNoteRows;
QueryConstructor SelectAllNotes;
SelectAllNotes.setTableName(QStringLiteral("Notes"));
SelectAllNotes.setOrderByClause("NoteId", Descending);
QSqlQuery getAllNotesQuery(MattyNotesDb);
if( getAllNotesQuery.exec(SelectAllNotes.constructSelectQuery()))
{
while (getAllNotesQuery.next())
{
MattyNoteRow Row;
Row.NoteId=getAllNotesQuery.value("NoteId").toInt();
Row.NoteTitle=getAllNotesQuery.value("NoteTitle").toString();
Row.NoteType=getAllNotesQuery.value("NoteType").toString();
Row.NoteText=getAllNotesQuery.value("NoteText").toString();
Row.EventTime=getAllNotesQuery.value("EventTime").toString();
Row.EventDate=getAllNotesQuery.value("EventDate").toString();
Row.CrTime=getAllNotesQuery.value("CrTime").toString();
Row.CrDate=getAllNotesQuery.value("CrDate").toString();
Row.TypeId=getAllNotesQuery.value("TypeId").toInt();
VectorOfNoteRows.push_back(Row);
}
}
else
{
QMessageBox::critical(NULL, QObject::tr("Error"), getAllNotesQuery.lastError().text());
}
return VectorOfNoteRows;
}
else
{
return QVector<MattyNoteRow>();
}
}
Отправка заметок на форму:
void NoteHolder::publishNotes(QWidget* ParentWidget)
{
erasePublishedNotes(ParentWidget);
getAllNotes();
QVector<class MattyNote>::iterator NoteNumber;
int i;
for (NoteNumber = ListOfAllNotes.begin(), i=0; NoteNumber < ListOfAllNotes.end();NoteNumber++, i++)
{
MattyGroupBox* MyGroupBox = new MattyGroupBox(*NoteNumber, ParentWidget);
ParentWidget->layout()->addWidget(MyGroupBox);
}
}
void NoteHolder::erasePublishedNotes(QWidget* ParentWidget)
{
MattyGroupBox* MgbTemp;
while ((MgbTemp = ParentWidget->findChild<MattyGroupBox*>()) != 0)
{
delete MgbTemp;
}
QGroupBox* GbTemp;
while ((GbTemp = ParentWidget->findChild<QGroupBox*>()) != 0)
{
delete GbTemp;
}
}
void NoteHolder::getAllNotes()
{
TotalNoteCount = 0;
if (!ListOfAllNotes.isEmpty())
ListOfAllNotes.clear();
QVector<struct MattyNoteRow> ListOfRows = DbManager::showNotes();
for (int i = 0; i < ListOfRows.length();i++)
{
MattyNote TempNote(ListOfRows[i]);
ListOfAllNotes.append(TempNote);
TotalNoteCount++;
}
}
Весь исходный код можно увидеть тут: GitHub
Разделение на классы, их методы, вызовы, зависимости и т.д. тут: Doxygen
Хочу, чтобы при импорте из csv к каждой записи добавлялось поле "время добавления"Думал сделать по аналогии, как при обычном запросе и добавить...
Делаю билинговую систему к торговой интернет-площадкеВ таблицах tbl_user - пользователи, tbl_billing_refill - пополнения баланса, tbl_billing - покупки/продажи...
У меня есть расписание на экранеНадо, чтобы по нажатию кнопки осуществлялся ScrollTo() либо ScrollBy() к элементу, но я не знаю, как определять координаты...