你好。我正在编写一个用于处理笔记的小程序。现在已经实现了最低限度的功能:可以创建、编辑和删除注释。对于 GUI,我有 Qt,基础是 SQLite。一般来说,一切正常,做我想做的事。但是我的编程经验趋于零,所以我怀疑有很多缺点我无法修复,因为我不知道去哪里找。我希望您指出所有明显的错误/问题/缺点。对从划分到类的逻辑到可能的内存泄漏的一切都感兴趣。
现在基本上有 12 个类:
- 4 个窗口:
MattyNotesMainWindow,MattySettingsDialog,addNoteDialog,MattyMessageBox - 使用数据库的类
DbManager - 用于编写 SQL 查询的类
QueryConstructor - 注解类本身
MattyNote - 用于可视化显示注释的构造函数类
MattyGroupBox - 排序和显示笔记的类
NoteHolder - css控制类
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