自定義的Qt儀錶盤控制項

来源:https://www.cnblogs.com/mengxiangdu/archive/2022/11/09/16874834.html
-Advertisement-
Play Games

Java 基礎一 【註釋】 comment 對代碼進行解釋說明1.Java規範的註釋有3種單行註釋://多行註釋:/* */文檔註釋(java特有)2.單行註釋和多行註釋的作用:對所寫的程式進行解釋說明,增強可讀性。方便自己,方便別人。可以調試所寫的代碼3.特點單行註釋和多行註釋,註釋了的內容不參與 ...


我做的儀錶盤控制項是個功能簡單的顯示控制項。該控制項在VS2015和Qt5.9上測試可用。它預設的顯示範圍是[0, 100],不能修改它的顯示範圍,因為不同的數值顯示在前界面上的效果不同,可能導致顯示重疊。成員函數只有一個setValue方法用來設置當前顯示值。

代碼如下,頭文件:

class MDashboard : public QWidget
{
    Q_OBJECT

public:
    MDashboard(QWidget* parent = nullptr);
    void setValue(qreal ivalue);

private:
    void paintEvent(QPaintEvent *event) override;

private:
    const static int radius;
    const static int maxv;
    const static int minv;
    qreal value;
};

CPP文件:

const int MDashboard::radius = 80;
const int MDashboard::minv = 0;
const int MDashboard::maxv = 100;

MDashboard::MDashboard(QWidget* parent) :
    QWidget(parent)
{
    value = 0;
}

void MDashboard::setValue(qreal ivalue)
{
    value = ivalue;
    update();
}

void MDashboard::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QPoint center(width() / 2, height() / 2);
    painter.save();

    /* 繪製背景圓形 */
    painter.translate(center);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(143, 143, 143));
    const int bkRadius = radius + 3;
    painter.drawEllipse(QPoint(), bkRadius, bkRadius);

    /* 繪製長短刻度線 */
    painter.rotate(-135);
    const int longStep = 10;
    const int shortStep = 50;
    for (int i = 0; i <= shortStep; i++)
    {
        /* 前80%綠色刻度線,後20%紅色 */
        painter.setPen((i < shortStep * 0.8) ? QColor(32, 243, 32) : QColor(243, 32, 32));
        if (i % (shortStep / longStep) != 0)
        {
            QPoint p1(0, -(radius - 8));
            QPoint p2(0, -radius);
            painter.drawLine(p1, p2);
        }
        else
        {
            QPoint pl(0, -(radius - 12));
            QPoint p2(0, -radius);
            painter.drawLine(pl, p2);
        }
        painter.rotate(270.0 / shortStep);
    }

    /* 繪製表盤名字和它的背景矩形 */
    painter.restore();
    QFontMetrics fm = painter.fontMetrics();
    int tx = center.x();
    int ty = int(center.y() + (radius / 1.4142));
    QString title = u8"儀錶盤";
    QSize tsz = fm.size(0, title);
    QRect trect(QPoint(tx - tsz.width() / 2, ty - tsz.height() / 2), tsz);
    painter.setPen(QColor(127, 127, 127));
    painter.setBrush(QColor(173, 163, 163));
    painter.drawRoundedRect(trect.adjusted(-6, -4, 6, 4), 3, 3);
    painter.setPen(QColor(243, 243, 243));
    painter.setBrush(Qt::NoBrush);
    painter.drawText(trect, title);/* 繪製每個長刻度線對應的文字 */
    painter.setPen(QColor(243, 243, 243));
    const int hand = radius - 21;
    for (int i = 0; i <= longStep; i++)
    {
        qreal angle = qDegreesToRadians(-135.0 + i * (270.0 / longStep));
        QString etext = QString::number(minv + i * (maxv - minv) / longStep); /* 註意這裡整形運算 */
        QPointF dirVec(qSin(angle), -qCos(angle));
        QPointF ecenter(center.x() + hand * dirVec.x(), center.y() + hand * dirVec.y());
        QSize esz = fm.size(0, etext);
        QRectF erect(QPointF(ecenter.x() - esz.width() / 2, ecenter.y() - esz.height() / 2), esz);
        painter.drawText(erect, etext);
    }

    /* 繪製表盤指針 */
    painter.save();
    QPoint triangle[] = /* 向上的三角形 */
    {
        { -5, 0 },
        { 0, 25 - radius },
        { 5, 0 },
    };
    qreal degree = -135.0 + 270.0 * (value - minv) / (maxv - minv);
    painter.translate(center);
    painter.rotate(degree);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::red);
    painter.drawPolygon(triangle, 3);
    painter.setPen(QPen(QColor(213, 0, 0), 2));
    painter.drawEllipse(QPoint(), 7, 7);
    painter.restore();
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前段時間公司一直要求進行只是梳理,整合,想著做一套知識管理系統,在gitee上找到了一個開源的項目管理系統,帶的有知識庫管理子系統,索性就拿來使用了; gitee地址 https://gitee.com/gouguopen/dev.git 【非廣告推廣】解決公司實際需要 我這個部署到本地了,使用集成 ...
  • 簡述 將各個功能拆分後分別封裝(各功能解耦),需要時可自由組合(包括執行順序) 話不多說,看個優化案例吧。 優化案例 最初版 以下是模擬客戶端想服務端發送請求的業務流程。 客戶端調用代碼如下。 // 客戶端 public class Client { public static void main( ...
  • 前言 大家早好、午好、晚好吖~ 這不光棍節快到了,表弟準備寫一封情書給他的女神,想在光棍節之前脫單。 為了提高成功率,於是跑來找我給他參謀參謀,本來我是不想理他的。 不過誰讓他是我表弟呢(請我洗jio),於是教給他程式員的終極浪漫絕招 先假裝給女神拍照,然後再把情書寫到她的照片上列印出來送給她,嘿嘿 ...
  • HTTP協議 1.什麼是HTTP協議? 超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用廣泛的一種網路協議。是工作在tcp/ip協議基礎上的,所有的www文件都遵守這個標準 http1.0 短連接 http1.1 長連接 HTTP是TCP/IP協議的一 ...
  • “心有所向,日復一日,必有精進” 前言: 想必大家看完我之前寫的搭建redis伺服器,大家都已經把redis搭建起來了吧~如果沒有搭建起來的小可愛請移步這裡哦~[從0到1搭建redis6](https://www.cnblogs.com/qsmm/p/16871488.html "從0到1搭建red ...
  • 文章有點長,我決定用半個小時來和你分享~😂 廢話不多說,上代碼。。。 基於Seata 1.5.2,項目中用 seata-spring-boot-starter 1. SeataDataSourceAutoConfiguration SeataDataSourceAutoConfiguration ...
  • 1、開發文檔 微信開發文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 安全規範:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 1、簽名演算法 (簽 ...
  • 簡介: 命令模式,又稱之為動作模式或者事務模式,屬於行為型的設計模式。 將不同的請求封裝成不同的請求對象,以便使用不同的請求; 角色都會用飯館來舉例子: 命令下達者:顧客 命令接受者:服務員 命令本身: 菜單 命令執行者:廚師 適用場景: Laravel的事件調度機制有用到了命令模式。 想要解耦服務 ...
一周排行
    -Advertisement-
    Play Games
  • 下麵是一個標準的IDistributedCache用例: public class SomeService(IDistributedCache cache) { public async Task<SomeInformation> GetSomeInformationAsync (string na ...
  • 這個庫提供了在啟動期間實例化已註冊的單例,而不是在首次使用它時實例化。 單例通常在首次使用時創建,這可能會導致響應傳入請求的延遲高於平時。在註冊時創建實例有助於防止第一次Request請求的SLA 以往我們要在註冊的時候實例單例可能會這樣寫: //註冊: services.AddSingleton< ...
  • 最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
  • Like運算符很好用,特別是它所提供的其中*、?這兩種通配符,在Windows文件系統和各類項目中運用非常廣泛。 但Like運算符僅在VB中支持,在C#中,如何實現呢? 以下是關於LikeString的四種實現方式,其中第四種為Regex正則表達式實現,且在.NET Standard 2.0及以上平... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式記憶體會偶發性暴漲,自己分析了下是非托管記憶體問題,讓我幫忙看下怎麼回事?哈哈,看到這個dump我還是非常有興趣的,居然還有這種游戲幣自助機類型的程式,下次去大玩家看看他們出幣的機器後端是不是C#寫的?由於dump是linux上的程式,剛好win ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 上一次的介紹,主要圍繞如何統一去捕獲異常,以及為每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/plain類型。 Filter為二方包異常手動捕獲 參考:ht ...
  • 大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麽? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市公司,漲薪 30%+,955 工作制,不咋加班,還不捲。 其他 ...
  • 引入依賴 <!--Freemarker wls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> ...
  • 你應如何運行程式 互動式命令模式 開始一個互動式會話 一般是在操作系統命令行下輸入python,且不帶任何參數 系統路徑 如果沒有設置系統的PATH環境變數來包括Python的安裝路徑,可能需要機器上Python可執行文件的完整路徑來代替python 運行的位置:代碼位置 不要輸入的內容:提示符和註 ...