diff --git a/NEWS.md b/NEWS.md index eddccfbe..b4989c66 100644 --- a/NEWS.md +++ b/NEWS.md @@ -17,6 +17,8 @@ Version 0.7.8 - enhancement: can set the color for the current line's number in the gutter - all predefined color schemes updated. - enhancement: check syntax/parse symbols when modifed and cursor's line changed. + - enhancement: edit problem properties + - enhancement: show problem description in the problem name lable's tooltip Version 0.7.7 - enhancement: Problem Set diff --git a/RedPandaIDE/RedPandaIDE.pro b/RedPandaIDE/RedPandaIDE.pro index fe5e1f84..7774d172 100644 --- a/RedPandaIDE/RedPandaIDE.pro +++ b/RedPandaIDE/RedPandaIDE.pro @@ -126,6 +126,7 @@ SOURCES += \ widgets/labelwithmenu.cpp \ widgets/macroinfomodel.cpp \ widgets/newprojectdialog.cpp \ + widgets/ojproblempropertywidget.cpp \ widgets/ojproblemsetmodel.cpp \ widgets/qconsole.cpp \ widgets/qpatchedcombobox.cpp \ @@ -247,6 +248,7 @@ HEADERS += \ widgets/labelwithmenu.h \ widgets/macroinfomodel.h \ widgets/newprojectdialog.h \ + widgets/ojproblempropertywidget.h \ widgets/ojproblemsetmodel.h \ widgets/qconsole.h \ widgets/qpatchedcombobox.h \ @@ -294,6 +296,7 @@ FORMS += \ widgets/custommakefileinfodialog.ui \ widgets/filepropertiesdialog.ui \ widgets/newprojectdialog.ui \ + widgets/ojproblempropertywidget.ui \ widgets/searchdialog.ui TRANSLATIONS += \ diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index f1099955..f2c9acd2 100644 --- a/RedPandaIDE/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts @@ -1016,7 +1016,7 @@ Are you really want to continue? Editor - + untitled 无标题 @@ -1029,12 +1029,12 @@ Are you really want to continue? 失败 - - - - - - + + + + + + Error 错误 @@ -1043,60 +1043,60 @@ Are you really want to continue? 无法写入文件"%1" - + Save As 另存为 - + The text to be copied exceeds count limit! 要复制的内容超过了行数限制! - + The text to be copied exceeds character limit! 要复制的内容超过了字符数限制! - + The text to be cut exceeds count limit! 要剪切的内容超过了行数限制! - + The text to be cut exceeds character limit! 要剪切的内容超过了字符数限制! - + Print Document 打印文档 - - - + + + Ctrl+click for more info Ctrl+单击以获取更多信息 - - + + Symbol '%1' not found! 未找到符号'%1'! - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Readonly 只读 @@ -2833,11 +2833,11 @@ Are you really want to continue? - - - - - + + + + + Issues 编译器 @@ -2981,7 +2981,7 @@ Are you really want to continue? 工具栏2 - + New 新建 @@ -3039,10 +3039,10 @@ Are you really want to continue? - - - - + + + + Compile 编译 @@ -3088,8 +3088,8 @@ Are you really want to continue? - - + + Copy 复制 @@ -3100,7 +3100,7 @@ Are you really want to continue? - + Paste 粘贴 @@ -3111,7 +3111,7 @@ Are you really want to continue? - + Select All 选择全部 @@ -3230,14 +3230,14 @@ Are you really want to continue? - + Problem Set 试题集 - + New Problem Set 新建试题集 @@ -3256,14 +3256,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -3296,7 +3296,7 @@ Are you really want to continue? - + Problem 试题 @@ -3579,7 +3579,7 @@ Are you really want to continue? - + Clear all breakpoints 删除所有断点 @@ -3680,7 +3680,7 @@ Are you really want to continue? - + Rename Symbol 重命名符号 @@ -3701,13 +3701,13 @@ Are you really want to continue? - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML @@ -3763,7 +3763,7 @@ Are you really want to continue? - + Open Folder 打开文件夹 @@ -3773,42 +3773,42 @@ Are you really want to continue? 运行参数... - + File Encoding 文件编码 - + Recent Files 文件历史 - - - - - - + + + + + + Debugging 正在调试 - - - - - - + + + + + + Running 正在运行 - - - - - - + + + + + + Compiling 正在编译 @@ -3817,654 +3817,655 @@ Are you really want to continue? 行:%1 列:%2 已选择:%3 总行数:%4 总长度:%5 - + Line:%1 Col:%2 Selected:%3 Lines:%4 Length:%5 Line: %1 Col: %2 Selected: %3 Lines: %4 Length: %5 行: %1 列: %2 已选择 :%3 总行数: %4 总长度: %5 - + Read Only 只读 - + Insert 插入 - + Overwrite 覆写 - + Close project 关闭项目 - + Are you sure you want to close %1? 你确定要关闭'%1'吗? - + Confirm 确认 - - - + + + Source file is not compiled. 源文件尚未编译。 - - + + Compile now? 现在编译? - - - + + + Source file is more recent than executable. 源文件比可执行程序新。 - + Recompile now? 重新编译? - + No compiler set 无编译器设置 - + No compiler set is configured. 没有配置编译器设置。 - + Can't start debugging. 无法启动调试器 - - + + Enable debugging 启用调试参数 - - + + You have not enabled debugging info (-g3) and/or stripped it from the executable (-s) in Compiler Options.<BR /><BR />Do you want to correct this now? 当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题? - + Project not built 项目尚未构建 - + Project hasn't been built. Build it now? 项目尚未构建。是否构建? - + Host applcation missing 宿主程序不存在 - + DLL project needs a host application to run. 动态链接库(DLL)需要一个宿主程序来运行。 - + But it's missing. 但它不存在。 - + Host application not exists 宿主程序不存在 - + Host application file '%1' doesn't exist. 宿主程序'%1'不存在。 - + Recompile? 重新编译? - - + + Save last open info error 保存上次打开信息失败 - + Can't remove old last open information file '%1' 无法删除旧上次打开信息文件'%1' - + Can't save last open info file '%1' 无法保存上次打开信息文件'%1' - + Load last open info error 载入上次打开信息失败 - + Can't load last open info file '%1' 无法载入上次打开信息文件'%1' - + Copy all 全部复制 - - + + Clear 清除 - + Export 导出 - + Insert Snippet 插入代码段 - - + + Problem Set %1 试题集%1 - Listen failed - 监听失败 + 监听失败 - Can't listen to port %1 form Competitve Companion. - 无法在网络端口"%1"监听Competitive Companion连接。 + 无法在网络端口"%1"监听Competitive Companion连接。 - You can turn off competitive companion support in the Problem Set options. - 您可以在“试题集”选项卡中关闭监听Competitive Companion选项。 + 您可以在“试题集”选项卡中关闭监听Competitive Companion选项。 - Or You can choose a different port number and try again. - 或者选择使用其他的网络端口。 + 或者选择使用其他的网络端口。 - + Red Panda Dev-C++ 小熊猫Dev-C++ - + + Properties... + 试题属性... + + + Remove 删除 - + Remove All Bookmarks 删除全部书签 - + Modify Description 修改描述 - - - + + + Bookmark Description 书签描述 - - - + + + Description: 描述: - + Show debug logs in the debug console 在调试主控台中显示调试器输出 - + Remove this search 清除这次搜索 - + Clear all searches 删除所有搜索 - + Breakpoint condition... 断点条件... - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Remove All Breakpoints Remove all breakpoints 删除所有断点 - + Remove Breakpoint 删除当前断点 - + Rename File 重命名文件 - - + + Add Folder 添加文件夹 - + New folder 新文件夹 - + Folder name: 文件夹: - + Rename Folder 重命名 - + Remove Folder 删除文件夹 - + Sort By Type 按类型排序 - + Sort alphabetically 按名称排序 - + Show inherited members 显示继承的成员 - + Goto declaration 跳转到声明处 - + Goto definition 跳转到定义处 - + Open in Editor 在编辑器中打开 - + Open in External Program 使用外部程序打开 - + Open in Terminal 在终端中打开 - + Open in Windows Explorer 在Windows浏览器中打开 - + Character sets 字符集 - + %1 files autosaved 已自动保存%1个文件 - + Save project 保存项目 - + The project '%1' has modifications. 项目'%1'有改动。 - - + + Do you want to save it? 需要保存吗? - - - - + + + + Save Error 保存失败 - + Change Project Compiler Set 改变项目编译器配置集 - + Change the project's compiler set will lose all custom compiler set options. 改变项目的编译器配置集会导致所有的自定义编译器选项被重置。 - + Do you really want to do that? 你真的想要做那些吗? - + Do you really want to clear all breakpoints in this file? 您真的要清除该文件的所有断点吗? - + New project 新建项目 - + Close %1 and start new project? 关闭'%1'以打开新项目? - + Folder not exist 文件夹不存在 - + Folder '%1' doesn't exist. Create it now? 文件夹'%1'不存在。是否创建? - + Can't create folder 无法创建文件夹 - + Failed to create folder '%1'. 创建文件夹'%1'失败。 - + Save new project as - + Red panda Dev-C++ project file (*.dev) 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + untitled 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - + Rename Error 重命名出错 - + Symbol '%1' is defined in system header. 符号'%1'在系统头文件中定义,无法修改。 - + New Name 新名称 - - + + Replace Error 替换出错 - + Can't open file '%1' for replace! 无法打开文件'%1'进行替换! - + Contents has changed since last search! 内容和上次查找时不一致。 - + Rich Text Format Files (*.rtf) RTF格式文件 (*.rtf) - + HTML Files (*.html) HTML文件 (*.html) - + The current problem set is not empty. 当前的试题集不是空的。 - + Problem %1 试题%1 - - + + Problem Set Files (*.pbs) 试题集文件 (*.pbs) - + Load Error 载入失败 - - + + Problem Case %1 试题案例%1 - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + Error 错误 - + Recent Projects 项目历史 - + File '%1' was changed. 磁盘文件'%1'已被修改。 - + Reload its content from disk? 是否重新读取它的内容? - + File '%1' was removed. 磁盘文件'%1'已被删除。 - + Keep it open? 是否保持它在小熊猫C++中打开的编辑窗口? - + Open 打开 - + Compile Failed 编译失败 - + Run Failed 运行失败 - - + + Confirm Convertion 确认转换 - - + + The editing file will be saved using %1 encoding. <br />This operation can't be reverted. <br />Are you sure to continue? 当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗? - + New Watch Expression 新监视表达式 - + Enter Watch Expression (it is recommended to use 'this->' for class members): 输入监视表达式 - + Parsing file %1 of %2: "%3" (%1/%2)正在解析文件"%3" - - + + Done parsing %1 files in %2 seconds 完成%1个文件的解析,用时%2秒 - + (%1 files per second) (每秒%1个文件) @@ -4541,6 +4542,39 @@ Are you really want to continue? 在从程序运行进程读取内容时出错。 + + OJProblemPropertyWidget + + + Form + 表单 + + + + URL + URL + + + + TextLabel + + + + + Description + 描述 + + + + OK + 确定 + + + + Cancel + 取消 + + Project @@ -5918,8 +5952,8 @@ Are you really want to continue? - - + + Can't open file '%1' for read. 无法读取文件'%1'. @@ -5930,7 +5964,7 @@ Are you really want to continue? 无法写入文件'%1'. - + Can't parse problem set file '%1':%2 无法解析试题集文件"%1":%2 @@ -6331,7 +6365,7 @@ Are you really want to continue? 自动链接 - + @@ -6407,7 +6441,7 @@ Are you really want to continue? 杂项 - + Program Runner diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 0a0a0bf4..fc06b8bc 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -19,6 +19,7 @@ #include "thememanager.h" #include "widgets/darkfusionstyle.h" #include "problems/problemcasevalidator.h" +#include "widgets/ojproblempropertywidget.h" #include #include @@ -569,13 +570,13 @@ void MainWindow::applySettings() if (pSettings->executor().enableProblemSet()) { if (pSettings->executor().enableCompetitiveCompanion()) { if (!mTcpServer.listen(QHostAddress::LocalHost,pSettings->executor().competivieCompanionPort())) { - QMessageBox::critical(nullptr, - tr("Listen failed"), - tr("Can't listen to port %1 form Competitve Companion.").arg(10045) - + "
" - +tr("You can turn off competitive companion support in the Problem Set options.") - + "
" - +tr("Or You can choose a different port number and try again.")); +// QMessageBox::critical(nullptr, +// tr("Listen failed"), +// tr("Can't listen to port %1 form Competitve Companion.").arg(10045) +// + "
" +// +tr("You can turn off competitive companion support in the Problem Set options.") +// + "
" +// +tr("Or You can choose a different port number and try again.")); } } if (idxProblem<0) @@ -1799,6 +1800,35 @@ void MainWindow::newEditor() void MainWindow::buildContextMenus() { + //context menu signal for the problem list view + ui->lstProblemSet->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->lstProblemSet, &QWidget::customContextMenuRequested, + this, &MainWindow::onLstProblemSetContextMenu); + mProblem_Properties = createActionFor( + tr("Properties..."), + ui->lstProblemSet + ); + connect(mProblem_Properties, &QAction::triggered, + [this]() { + QModelIndex idx = ui->lstProblemSet->currentIndex(); + if (!idx.isValid()) + return; + POJProblem problem=mOJProblemSetModel.problem(idx.row()); + if (!problem) + return; + OJProblemPropertyWidget dialog; + dialog.setName(problem->name); + dialog.setUrl(problem->url); + dialog.setDescription(problem->description); + if (dialog.exec() == QDialog::Accepted) { + problem->url = dialog.url(); + problem->description = dialog.description(); + if (problem == mOJProblemModel.problem()) { + ui->lblProblem->setText(mOJProblemModel.getTitle()); + ui->lblProblem->setToolTip(mOJProblemModel.getTooltip()); + } + } + }); //context menu signal for the watch view ui->watchView->setContextMenuPolicy(Qt::CustomContextMenu); @@ -2586,6 +2616,15 @@ void MainWindow::onFilesViewContextMenu(const QPoint &pos) menu.exec(ui->treeFiles->mapToGlobal(pos)); } +void MainWindow::onLstProblemSetContextMenu(const QPoint &pos) +{ + QMenu menu(this); + menu.addAction(mProblem_Properties); + QModelIndex idx =ui->lstProblemCases->currentIndex(); + mProblem_Properties->setEnabled(idx.isValid()); + menu.exec(ui->lstProblemSet->mapToGlobal(pos)); +} + void MainWindow::onProblemSetIndexChanged(const QModelIndex ¤t, const QModelIndex &/* previous */) { QModelIndex idx = current; @@ -2597,11 +2636,13 @@ void MainWindow::onProblemSetIndexChanged(const QModelIndex ¤t, const QMod ui->txtProblemCaseOutput->clear(); ui->tabProblem->setEnabled(false); ui->lblProblem->clear(); + ui->lblProblem->setToolTip(""); } else { ui->btnRemoveProblem->setEnabled(true); POJProblem problem = mOJProblemSetModel.problem(idx.row()); mOJProblemModel.setProblem(problem); ui->lblProblem->setText(mOJProblemModel.getTitle()); + ui->lblProblem->setToolTip(mOJProblemModel.getTooltip()); ui->lstProblemCases->setCurrentIndex(mOJProblemModel.index(0,0)); openCloseBottomPanel(true); ui->tabMessages->setCurrentWidget(ui->tabProblem); @@ -2643,6 +2684,7 @@ void MainWindow::onProblemNameChanged(int index) if (idx.isValid() && index == idx.row()) { POJProblem problem = mOJProblemSetModel.problem(idx.row()); ui->lblProblem->setText(mOJProblemModel.getTitle()); + ui->lblProblem->setToolTip(mOJProblemModel.getTooltip()); } } @@ -3498,7 +3540,7 @@ void MainWindow::onOJProblemCaseFinished(const QString &id, int current, int tot } ui->pbProblemCases->setMaximum(total); ui->pbProblemCases->setValue(current); - ui->lblProblem->setText(mOJProblemModel.getTitle()); +// ui->lblProblem->setText(mOJProblemModel.getProblemTitle()); } void MainWindow::cleanUpCPUDialog() diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index 2a22961d..ea0fc399 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -227,6 +227,7 @@ private slots: void onDebugConsoleContextMenu(const QPoint& pos); void onFileEncodingContextMenu(const QPoint& pos); void onFilesViewContextMenu(const QPoint& pos); + void onLstProblemSetContextMenu(const QPoint& pos); void onProblemSetIndexChanged(const QModelIndex ¤t, const QModelIndex &previous); void onProblemCaseIndexChanged(const QModelIndex ¤t, const QModelIndex &previous); void onProblemNameChanged(int index); @@ -582,6 +583,9 @@ private: QAction * mBookmark_RemoveAll; QAction * mBookmark_Modify; + //action for problem set + QAction * mProblem_Properties; + // QWidget interface protected: void closeEvent(QCloseEvent *event) override; diff --git a/RedPandaIDE/problems/ojproblemset.h b/RedPandaIDE/problems/ojproblemset.h index 74040b07..a7a97b9f 100644 --- a/RedPandaIDE/problems/ojproblemset.h +++ b/RedPandaIDE/problems/ojproblemset.h @@ -31,6 +31,7 @@ using POJProblemCase = std::shared_ptr; struct OJProblem { QString name; QString url; + QString description; QVector cases; }; diff --git a/RedPandaIDE/systemconsts.h b/RedPandaIDE/systemconsts.h index 9bc6a70c..e6deb8dd 100644 --- a/RedPandaIDE/systemconsts.h +++ b/RedPandaIDE/systemconsts.h @@ -3,7 +3,7 @@ #include -#define DEVCPP_VERSION "0.7.9" +#define DEVCPP_VERSION "0.7.8" #define APP_SETTSINGS_FILENAME "redpandacpp.ini" #ifdef Q_OS_WIN diff --git a/RedPandaIDE/widgets/ojproblempropertywidget.cpp b/RedPandaIDE/widgets/ojproblempropertywidget.cpp new file mode 100644 index 00000000..597444af --- /dev/null +++ b/RedPandaIDE/widgets/ojproblempropertywidget.cpp @@ -0,0 +1,60 @@ +#include "ojproblempropertywidget.h" +#include "ui_ojproblempropertywidget.h" + +OJProblemPropertyWidget::OJProblemPropertyWidget(QWidget *parent) : + QDialog(parent), + ui(new Ui::OJProblemPropertyWidget) +{ + ui->setupUi(this); +} + +OJProblemPropertyWidget::~OJProblemPropertyWidget() +{ + delete ui; +} + +void OJProblemPropertyWidget::setName(const QString &name) +{ + QFont f = ui->lbName->font(); + f.setPointSize(f.pointSize()+2); + f.setBold(true); + ui->lbName->setFont(f); + ui->lbName->setText(name); +} + +void OJProblemPropertyWidget::setUrl(const QString &url) +{ + ui->txtURL->setText(url); +} + +void OJProblemPropertyWidget::setDescription(const QString &description) +{ + ui->txtDescription->setHtml(description); +} + +QString OJProblemPropertyWidget::name() +{ + return ui->lbName->text(); +} + +QString OJProblemPropertyWidget::url() +{ + return ui->txtURL->text(); +} + +QString OJProblemPropertyWidget::description() +{ + return ui->txtDescription->toHtml(); +} + +void OJProblemPropertyWidget::on_btnOk_clicked() +{ + this->accept(); +} + + +void OJProblemPropertyWidget::on_btnCancel_clicked() +{ + this->reject(); +} + diff --git a/RedPandaIDE/widgets/ojproblempropertywidget.h b/RedPandaIDE/widgets/ojproblempropertywidget.h new file mode 100644 index 00000000..4efa22f2 --- /dev/null +++ b/RedPandaIDE/widgets/ojproblempropertywidget.h @@ -0,0 +1,33 @@ +#ifndef OJPROBLEMPROPERTYWIDGET_H +#define OJPROBLEMPROPERTYWIDGET_H + +#include + +namespace Ui { +class OJProblemPropertyWidget; +} + +class OJProblemPropertyWidget : public QDialog +{ + Q_OBJECT + +public: + explicit OJProblemPropertyWidget(QWidget *parent = nullptr); + ~OJProblemPropertyWidget(); + void setName(const QString& name); + void setUrl(const QString& url); + void setDescription(const QString& description); + QString name(); + QString url(); + QString description(); + +private slots: + void on_btnOk_clicked(); + + void on_btnCancel_clicked(); + +private: + Ui::OJProblemPropertyWidget *ui; +}; + +#endif // OJPROBLEMPROPERTYWIDGET_H diff --git a/RedPandaIDE/widgets/ojproblempropertywidget.ui b/RedPandaIDE/widgets/ojproblempropertywidget.ui new file mode 100644 index 00000000..2514028a --- /dev/null +++ b/RedPandaIDE/widgets/ojproblempropertywidget.ui @@ -0,0 +1,93 @@ + + + OJProblemPropertyWidget + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + URL + + + + + + + TextLabel + + + + + + + + + + Description + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + + + + diff --git a/RedPandaIDE/widgets/ojproblemsetmodel.cpp b/RedPandaIDE/widgets/ojproblemsetmodel.cpp index f2d0c79c..2917f431 100644 --- a/RedPandaIDE/widgets/ojproblemsetmodel.cpp +++ b/RedPandaIDE/widgets/ojproblemsetmodel.cpp @@ -87,6 +87,7 @@ void OJProblemSetModel::saveToFile(const QString &fileName) QJsonObject problemObj; problemObj["name"]=problem->name; problemObj["url"]=problem->url; + problemObj["description"]=problem->description; QJsonArray cases; foreach (const POJProblemCase& problemCase, problem->cases) { QJsonObject caseObj; @@ -131,6 +132,7 @@ void OJProblemSetModel::loadFromFile(const QString &fileName) POJProblem problem = std::make_shared(); problem->name = problemObj["name"].toString(); problem->url = problemObj["url"].toString(); + problem->description = problemObj["description"].toString(); QJsonArray casesArray = problemObj["cases"].toArray(); foreach (const QJsonValue& caseVal, casesArray) { QJsonObject caseObj = caseVal.toObject(); @@ -292,6 +294,18 @@ QString OJProblemModel::getTitle() return title; } +QString OJProblemModel::getTooltip() +{ + if (!mProblem) + return ""; + QString s; + s=QString("

%1

").arg(mProblem->name); + if (!mProblem->description.isEmpty()) + s+=QString("

%1

") + .arg(mProblem->description); + return s; +} + int OJProblemModel::rowCount(const QModelIndex &) const { if (mProblem==nullptr) diff --git a/RedPandaIDE/widgets/ojproblemsetmodel.h b/RedPandaIDE/widgets/ojproblemsetmodel.h index fd2f7c83..d20e4334 100644 --- a/RedPandaIDE/widgets/ojproblemsetmodel.h +++ b/RedPandaIDE/widgets/ojproblemsetmodel.h @@ -20,6 +20,7 @@ public: int count(); void update(int row); QString getTitle(); + QString getTooltip(); private: POJProblem mProblem;