您现在的位置是:首页 >技术交流 >「C++」Qt可视化交互封装「遗传算法求解最佳路径问题(一日游规划,商旅问题)」网站首页技术交流

「C++」Qt可视化交互封装「遗传算法求解最佳路径问题(一日游规划,商旅问题)」

是陆柒 2024-07-24 12:01:02
简介「C++」Qt可视化交互封装「遗传算法求解最佳路径问题(一日游规划,商旅问题)」

「C++」Qt可视化交互封装「遗传算法求解最佳路径问题(一日游规划,商旅问题)」

1 效果与要求

效果

「C++」遗传算法求解最佳路径问题(一日游规划)的Qt可视化

要求

  1. 使用Qt对程序进行可视化交互的封装;
  2. 考虑出发点和结束点,必须从出发点出发,在结束点结束;
  3. 鼠标点击进行出发点和结束点的选择;
  4. 输入预算和最远行程;
  5. 画出形成的路线;

2 代码

2.1 算法代码

主要采用遗传算法,具体可看上一篇文章:「C++」遗传算法求解最佳路径问题(一日游规划,商旅问题) 1。由于该算法程序在编写时采用的是随机起点和终点的策略,所以要对代码稍作修改即可。这里不再赘述。

2.2 Qt代码

2.2.1 Qt类

  1. class QLabel:可以创建一个 Label,用于显示程序运行中的提示;
  2. class QPushButton:创建一个按钮,为其绑定槽函数后可以实现点击按钮实现任意操作;
  3. class QSpinBox:创建一个 int 型的数字输入框,迭代次数应为整型;
  4. class QDoubleSpinBox:创建一个 double 型的数字输入框,预算和最远行程应为 double 型;
  5. class QComboBox:创建一个下拉选项框,用于选择出发点和结束点(选择出发点和结束点的一种实现方法);
  6. 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 函数实现不同的点击事件。

参考


  1. 「C++」Qt可视化交互封装「遗传算法求解最佳路径问题(一日游规划,商旅问题)」 ↩︎

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。