1 效果与要求
效果
「C++」遗传算法求解最佳路径问题(一日游规划)的Qt可视化
要求
- 使用Qt对程序进行可视化交互的封装;
- 考虑出发点和结束点,必须从出发点出发,在结束点结束;
- 鼠标点击进行出发点和结束点的选择;
- 输入预算和最远行程;
- 画出形成的路线;
2 代码
2.1 算法代码
主要采用遗传算法,具体可看上一篇文章:「C++」遗传算法求解最佳路径问题(一日游规划,商旅问题) 1。由于该算法程序在编写时采用的是随机起点和终点的策略,所以要对代码稍作修改即可。这里不再赘述。
2.2 Qt代码
2.2.1 Qt类
- class QLabel:可以创建一个 Label,用于显示程序运行中的提示;
- class QPushButton:创建一个按钮,为其绑定槽函数后可以实现点击按钮实现任意操作;
- class QSpinBox:创建一个 int 型的数字输入框,迭代次数应为整型;
- class QDoubleSpinBox:创建一个 double 型的数字输入框,预算和最远行程应为 double 型;
- class QComboBox:创建一个下拉选项框,用于选择出发点和结束点(选择出发点和结束点的一种实现方法);
- class QGraphicsView:创建一个GraphicsView场景,显示地图和路线;
这里没有采用 Qt creator 进行控件布局设置,而是通过代码构建。
示例:
Label_LBmaxgen = new QLabel(tr("迭代次数:"));
Label_LBmaxgen->setFont(label_font);
Label_LBmap = new QLabel(tr("地图文件:"));
Label_LBmap->setFont(label_font);
Label_LBbudget = new QLabel(tr("最大预算:"));
Label_LBbudget->setFont(label_font);
Label_LBmaxtrip = new QLabel(tr("最大行程:"));
Label_LBmaxtrip->setFont(label_font);
2.2.2 自定义类
class mappointCircle:对 class QGraphicsEllipseItem 的继承,主要用于实现点击事件(左键单击选为起点,右键单机选为终点);
#pragma once
#include <QObject>
#include <QGraphicsItem>
class mappointCircle : public QObject, public QGraphicsEllipseItem
{
Q_OBJECT;
private:
int id;
int clicked; // 起点=1,终点=2,起点终点=3
public:
mappointCircle(int id, QGraphicsItem *parent = nullptr);
mappointCircle(int id, qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent = nullptr);
~mappointCircle();
signals:
void signal_selectHead(int id);
void signal_selectEnd(int id);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
public:
void changeColor();
void reset();
};
通过 mousePressEvent 函数实现不同的点击事件。