Qt:指南针控件

9 篇文章 1 订阅

前言

提供了基本的实现思路,没有使用贴图,完全自己绘制的指南针,具体控件的接口和配色可以根据自己需要进行调整。

聊聊代码

compass.h

#ifndef COMPASS_H
#define COMPASS_H

#include <qframe.h>

namespace Ui {
class Compass;
}

class Compass : public QFrame {
    Q_OBJECT

public:
    explicit Compass(QWidget *parent = NULL);
    ~Compass();

public slots:
    void set_direction(const float direction);
    void set_campass_scale(const float scale);  // 设置指南针在控件中的比例
    void set_campass_scale(const quint32 widget_scale, const quint32 campass_scale);  // 设置指南针在控件中的比例

protected:
    void paintEvent(QPaintEvent *event);

private:
    Ui::Compass *_ui;

    float _direction;
    float _campass_scale;
};

#endif // COMPASS_H

compass.cpp

#include "compass.h"
#include "ui_compass.h"

#include <qevent.h>
#include <qpainter.h>
#include <qrect.h>

#include <qdebug.h>

Compass::Compass(QWidget *parent) :
    QFrame(parent),
    _ui(new Ui::Compass),
    _direction(0.0),
    _campass_scale(4.0 / 5.0) {

    _ui->setupUi(this);
}

Compass::~Compass() {
    delete _ui;
}

void Compass::set_direction(const float direction) {
    _direction = float(int(direction) % 360) + float(direction - float(int(direction)));
    _ui->lb_angle->setText(QString::number(_direction) + QApplication::translate("Compass", "\302\260", nullptr));
    update();
}

void Compass::set_campass_scale(const float scale) {
    _campass_scale = scale;
}

void Compass::set_campass_scale(const quint32 widget_scale, const quint32 campass_scale) {
    _campass_scale = float(campass_scale) / float(widget_scale);
}

void Compass::paintEvent(QPaintEvent *event) {
    int side = qMin(width() * _campass_scale, height() * _campass_scale);

    QColor calibration_color(0, 127, 127, 191);

    static const QString direction_name[] = {
        QString("N"), QString("NE"),
        QString("E"), QString("ES"),
        QString("S"), QString("WS"),
        QString("W"), QString("NW")
    };

    static const QPoint red_left[] = {
        QPoint(0, 0),
        QPoint(-7, 0),
        QPoint(0, -70)
    };

    static const QPoint red_right[] = {
        QPoint(7, 0),
        QPoint(0, 0),
        QPoint(0, -70)
    };

    static const QPoint white_left[] = {
        QPoint(0, 0),
        QPoint(-7, 0),
        QPoint(0, 70)
    };

    static const QPoint white_right[] = {
        QPoint(7, 0),
        QPoint(0, 0),
        QPoint(0, 70)
    };


    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width() / 2, height() * _campass_scale / 2);
    painter.scale(side / 200.0, side / 200.0);

    painter.setPen(Qt::NoPen);
    painter.setBrush(calibration_color);
    painter.setPen(calibration_color);

    for (int i = 0; i < 18; ++i) {
        painter.save();
        painter.setFont(QFont("Times", 10));
        painter.rotate(-90.0);
        painter.rotate(20.0 * i);
        painter.translate(95, 0);
        painter.rotate(90.0);

        painter.drawText(QRect(-19, -7, 38, 14), Qt::AlignCenter, QString::number(i * 20));

        painter.restore();
    }

    painter.save();
    painter.rotate(-90.0);
    for (int i = 0; i < 18; ++i) {
        painter.drawLine(78, 0, 88, 0);
        painter.rotate(20.0);
    }
    painter.restore();

    painter.save();
    for (int i = 0; i < 36; ++i) {
        if ((i % 10) != 0)
            painter.drawLine(82, 0, 88, 0);
        painter.rotate(20.0);
    }
    painter.restore();

    painter.save();
    for (int i = 0; i < 180; ++i) {
        if ((i % 5) != 0)
            painter.drawLine(84, 0, 88, 0);
        painter.rotate(2.0);
    }
    painter.restore();

    painter.save();
    painter.setBrush(Qt::NoBrush);
    painter.setPen(Qt::red);
    int pix = 8;
    for (int i = 0; i < 8; ++i) {
        painter.drawArc(-70, -70, 140, 140, (45 * i + pix) * 16, (45 - 2*pix) * 16);
    }

    painter.restore();


    for (int i = 0; i < 8; ++i) {
        painter.save();

        if (i == 0) {
            painter.setPen(Qt::red);
        } else {
            painter.setPen(Qt::blue);
        }
        painter.setBrush(Qt::white);

        if (i % 2 == 0) {
            painter.setFont(QFont("Times", 12, QFont::Bold));
        } else {
            painter.setFont(QFont("Times", 8));
        }

        painter.rotate(-90.0);
        painter.rotate(45.0 * i);
        painter.translate(70, 0);
        painter.rotate(90.0);

        painter.drawText(QRect(-19, -7, 38, 14), Qt::AlignCenter, direction_name[i]);

        painter.restore();
    }

    painter.save();
    painter.rotate(_direction);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(Qt::darkRed));
    painter.drawConvexPolygon(red_left, 3);
    painter.setBrush(QColor(Qt::red));
    painter.drawConvexPolygon(red_right, 3);
    painter.setBrush(QColor(Qt::lightGray));
    painter.drawConvexPolygon(white_left, 3);
    painter.setBrush(QColor(Qt::white));
    painter.drawConvexPolygon(white_right, 3);
    painter.restore();
}

效果图

在这里插入图片描述

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: Qt是一个跨平台的C++应用程序开发框架。Qt提供了许多UI件来帮助我们构建应用程序。Qt指南针件可以被用来实现一个指向某个方向的指南针。 在Qt中,我们可以使用QCompass类来读取设备的方向信息。我们可以把这个方向信息传递给指针件的角度属性,使它指向正确的方向。指南针件还可以使用图像来自定义指针的外观,使其更符合应用程序的主题。 为了下载这个件,我们需要先安装Qt开发环境。然后,我们可以在Qt Creator中打开项目,点击Tool->Forms,直接在Designer中拖拽指南针件到我们的应用程序窗口中。 如果我们想使用Qt指南针件的高级功能,比如与传感器交互,我们需要使用Qt Mobility模块。这个模块包含了很多API来帮助我们方便地获取设备的方向和位置信息。 总之,Qt指南针件是一个有用的UI件,可以增强我们的应用程序的功能和用户体验。通过简单的设置,我们可以让指南针指向任何方向,并自定义它的外观,使其更符合我们的应用程序的需求。 ### 回答2: Qt 指南针件是一款基于 Qt 库所开发的指南针件,它能够在用户界面中方便地显示方向指示信息,有助于用户更好地了解当前朝向。下载 Qt 指南针件主要可以通过以下步骤: 首先,打开 Qt 开发工具,选择 File 菜单下的 New File or Project 进入新建项目界面。在此界面中选择 Qt Widgets Application 作为项目类型,配置好项目的名称和路径等信息后,点击 Next。 接着,在项目配置界面中,勾选要使用的模块和库文件,确保 Qt 指南针件能够被正常使用。在完成配置后,点击 Next 进入项目概览界面。 在项目概览界面中,确认项目设置无误,点击 Finish 按钮创建新项目。创建后,在项目工程目录中可以找到 Qt 指南针件的源码文件和相关资源,包括头文件、源码文件和样式表等。 最后,将下载好的 Qt 指南针件的文件复制到项目目录中,添加到项目中即可正常使用。可以参考 Qt 指南针件的帮助文档和示例代码,了解更多的件使用方法和注意事项。总的来说,Qt 指南针件是一款非常实用的用户界面件,它可以帮助用户更好地了解方向信息,提高用户体验,值得开发者们去尝试使用。 ### 回答3: Qt框架是一个基于C++编程语言的开发工具,可以帮助开发者快速构建跨平台应用程序。其中,Qt指南针件是其自带的一种功能强大的界面件,确保用户能够获取实时方向信息。 要下载Qt指南针件,首先需要安装Qt框架。安装方法如下: 1. 登录Qt官网,进入下载页面 2. 根据所使用的操作系统选择合适版本,比如Windows、MacOS或Linux 3. 下载所需安装文件,一般包括Qt Creator和Qt库文件 4. 根据提示完成安装 在安装完成后,在Qt Creator中即可使用Qt指南针件。具体使用方法如下: 1. 在Qt Creator中,新建一个Qt Widgets项目 2. 在项目界面中,选择“Design”模式,并选择“添加件” 3. 在件库中找到“指南针件”(或者搜索“QwtCompass”) 4. 将件拖放到窗口中 5. 可以通过属性编辑器,设置指针的颜色、指向方向等属性 除了通过Qt Creator使用Qt指南针件,还可以通过安装Qt Qwt库来使用。这是一个基于Qt的轻量级图表和数据可视化工具,其中包括了Qt指南针件。要使用Qt Qwt库,则需要执行以下步骤: 1. 打开Qt Creator,新建一个Qt Widgets项目 2. 从Qt Qwt官网下载对应版本的库文件 3. 将库文件解压缩,并将其复制到Qt项目的根目录中 4. 在.pro文件中添加如下代码: # Qwt INCLUDEPATH += $$PWD/qwt-6.1.5/include LIBS += -L$$PWD/qwt-6.1.5/lib -lqwt 5. 在Qt Creator中打开项目,添加以下头文件: #include <qwt_compass.h> #include <qwt_compass_rose.h> 通过以上步骤即可使用Qt指南针件,实现方向指示功能。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值