qwt 之 QwtPlotPicker

QwtPlotMarkerQwtPlotPickerQwt 庫中用于增強 QwtPlot 功能的兩個重要類。它們分別用于在圖中添加標記和實現交互式的選擇或拖動功能。

QwtPlotPicker 提供了交互式的選擇工具,它允許用戶通過鼠標點擊或拖動來選擇圖表中的數據點或區域。這對于實現縮放、平移或者其他基于用戶輸入的操作非常有用。

主要功能

? 選擇模式:可以選擇不同的選擇模式,如點選擇、矩形選擇、多邊形選擇等。
? 事件處理:通過信號和槽機制響應用戶的交互行為(如鼠標點擊、拖動等)。
? 坐標轉換:提供從屏幕坐標到數據坐標的轉換方法。
? 自定義繪圖:可以通過重寫繪制函數來自定義選擇框或其他視覺反饋。

示例代碼 1

#include <QApplication>
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotPicker>
#include <QwtPickerMachine>
#include <QwtPlotPanner> // 如果需要平移功能class PickerTracker : public QObject {Q_OBJECTpublic slots:void trackerText(const QString &text) {qDebug() << "Tracker Text:" << text;}void selected(const QPointF &pos) {qDebug() << "Selected Position:" << pos;}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);// 創建并配置 QwtPlotQwtPlot plot;plot.setTitle("QwtPlotPicker Example");// 添加一條曲線QwtPlotCurve *curve = new QwtPlotCurve("Sample Curve");QVector<double> xData = {0.0, 1.0, 2.0, 3.0, 4.0};QVector<double> yData = {0.0, 1.0, 4.0, 9.0, 16.0};curve->setSamples(xData, yData);curve->attach(&plot);// 創建并配置 QwtPlotPickerQwtPlotPicker *picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, QwtPicker::PointSelection,QwtPlotPicker:: RubberBand, QwtPicker::AlwaysOn, plot.canvas());picker->setStateMachine(new QwtPickerDragPointMachine()); // 設置選擇模式// 連接信號和槽PickerTracker tracker;connect(picker, SIGNAL(trackerText(const QString &)), &tracker, SLOT(trackerText(const QString &)));connect(picker, SIGNAL(selected(const QPointF &)), &tracker, SLOT(selected(const QPointF &)));// 如果需要平移功能QwtPlotPanner *panner = new QwtPlotPanner(plot.canvas());panner->setMouseButton(Qt::MidButton); // 使用中間按鈕進行平移// 顯示窗口plot.resize(800, 600);plot.show();return app.exec();
}

示例代碼 2

	class DistancePicker : public QwtPlotPicker{public:DistancePicker( QWidget* canvas ): QwtPlotPicker( canvas ){setTrackerMode( QwtPicker::ActiveOnly );setStateMachine( new QwtPickerDragLineMachine() );setRubberBand( QwtPlotPicker::PolygonRubberBand );}virtual QwtText trackerTextF( const QPointF& pos ) const QWT_OVERRIDE{QwtText text;const QPolygon points = selection();if ( !points.isEmpty() ){QString num;num.setNum( QLineF( pos, invTransform( points[0] ) ).length() );QColor bg( Qt::white );bg.setAlpha( 200 );text.setBackgroundBrush( QBrush( bg ) );text.setText( num );}return text;}};

setStateMachine 方法

QwtPlotPickersetStateMachine() 方法用于設置選擇器的狀態機,這決定了用戶如何與圖表進行交互。Qwt 提供了幾種預定義的狀態機類,每種狀態機都實現了一種特定的交互模式。以下是 Qwt 中常見的幾種狀態機:

  1. QwtPickerMachine
    這是所有其他狀態機的基礎類,它本身不提供具體的行為,但可以作為自定義狀態機的起點。
  2. QwtPickerClickPointMachine
    這種狀態機允許用戶通過單擊鼠標來選擇一個點。每次點擊都會觸發一個選定點的信號。
    ? 適用場景:當你只需要用戶在圖表上點擊以選擇單個數據點時使用。
  3. QwtPickerDragPointMachine
    這種狀態機允許用戶通過拖動鼠標來選擇一個點。用戶按下鼠標按鈕并移動到新的位置后釋放按鈕,這個新位置會被視為選定的點。
    ? 適用場景:適用于需要更精確地選擇或調整圖表上的某個點的情況。
  4. QwtPickerRectMachine
    這種狀態機允許用戶通過拖動鼠標繪制一個矩形區域來選擇多個點。矩形的選擇框會隨著鼠標的移動而更新,直到用戶釋放鼠標按鈕。
    ? 適用場景:當你需要讓用戶選擇一個矩形區域內的所有數據點時使用。
  5. QwtPickerPolygonMachine
    這種狀態機允許用戶通過連續點擊來創建一個多邊形區域,最終形成一個封閉的多邊形選擇區域。用戶可以通過雙擊或者按下一個特定的鍵(如 Enter)來完成多邊形的選擇。
    ? 適用場景:適用于復雜形狀的選擇區域,比如非矩形的不規則區域。

setStateMachine 使用示例

#include <QApplication>
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotPicker>
#include <QwtPickerMachine>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 創建并配置 QwtPlotQwtPlot plot;plot.setTitle("QwtPlotPicker Example");// 添加一條曲線QwtPlotCurve *curve = new QwtPlotCurve("Sample Curve");QVector<double> xData = {0.0, 1.0, 2.0, 3.0, 4.0};QVector<double> yData = {0.0, 1.0, 4.0, 9.0, 16.0};curve->setSamples(xData, yData);curve->attach(&plot);// 創建并配置 QwtPlotPickerQwtPlotPicker *picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, QwtPicker::PointSelection,QwtPlotPicker::RubberBand, QwtPicker::AlwaysOn, plot.canvas());// 設置狀態機picker->setStateMachine(new QwtPickerClickPointMachine()); // 單點選擇// 或者// picker->setStateMachine(new QwtPickerDragPointMachine()); // 拖動選擇點// 或者// picker->setStateMachine(new QwtPickerRectMachine()); // 矩形區域選擇// 或者// picker->setStateMachine(new QwtPickerPolygonMachine()); // 多邊形區域選擇// 顯示窗口plot.resize(800, 600);plot.show();return app.exec();
}

自定義狀態機

如果你的需求超出了上述預定義狀態機的功能,你可以繼承 QwtPickerMachine 類并實現自己的狀態機邏輯。

綜合應用

當你想要創建一個帶有交互功能的圖表時,通常步驟如下:

  1. 創建 QwtPlot 實例。
  2. 添加繪圖項,如 QwtPlotCurve 或其他類型的繪圖項。
  3. 創建并配置 QwtPlotMarker 來添加靜態標記。
  4. 創建并配置 QwtPlotPicker 來實現交互功能,并根據需要設置選擇模式和事件處理邏輯。
  5. 連接信號和槽,以便對用戶的交互行為做出響應。
  6. 如果需要,還可以添加其他交互組件,如 QwtPlotPanner 用于平移功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63679.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++圣誕樹

系列文章 序號直達鏈接1C/C愛心代碼2C/C跳動的愛心3C/C李峋同款跳動的愛心代碼4C/C滿屏飄字表白代碼5C/C大雪紛飛代碼6C/C煙花代碼7C/C黑客帝國同款字母雨8C/C櫻花樹代碼9C/C奧特曼代碼10C/C精美圣誕樹11C/C俄羅斯方塊12C/C貪吃蛇13C/C孤單又燦爛的神-鬼怪14C/C閃爍的愛心15C…

lua dofile 傳參數

cat 1.lua arg[1] 111 arg[2] 222 dofile(./2.lua) cat 2.lua print("First argument is: " .. arg[1]) print("Second argument is: " .. arg[2]) 執行 lua 1.lua&#xff0c;結果為&#xff1a; First argument is: 111 Second argument is: 222 l…

電商數據流通的未來:API接口的智能化與自動化趨勢

在數字化時代&#xff0c;電子商務行業正在以前所未有的速度發展&#xff0c;而API&#xff08;應用程序編程接口&#xff09;接口作為電商領域的重要組成部分&#xff0c;其應用和發展趨勢也日益受到關注。API接口作為電商系統與外部服務或平臺交互的橋梁&#xff0c;對電商數…

投標心態:如何在“標海戰術”中保持清醒的頭腦?

在競爭激烈的市場環境下&#xff0c;“標海戰術”——即大規模參與投標——已經成為許多企業爭取市場份額的重要策略。然而&#xff0c;盲目追求投標數量可能導致資源浪費、團隊疲勞以及戰略目標的模糊化。在這種高強度的競爭模式中&#xff0c;如何保持清醒的頭腦&#xff0c;…

【蒼穹外賣】學習心得體會-隨筆

前言 寫了很久&#xff0c;終于可以完整運行項目了&#xff0c;記錄下這幾天的心得體會回顧一下知識點 第一天、Git 分布式版本控制工具 一、Git概述 定義&#xff1a;是分布式版本控制工具&#xff0c;用于管理軟件開發中的源代碼文件&#xff0c;像Java類、xml文件、html…

windows C#-使用構造函數

實例化類或結構時&#xff0c;將會調用其構造函數。 構造函數與該類或結構具有相同名稱&#xff0c;并且通常初始化新對象的數據成員。 在下面的示例中&#xff0c;通過使用簡單構造函數定義了一個名為 Taxi 的類。 然后使用 new 運算符對該類進行實例化。 在為新對象分配內存…

研發效能DevOps: Vite 使用 Element Plus

目錄 一、實驗 1.環境 2.初始化前端項目 3.安裝 vue-route 4.安裝 pinia 5.安裝 axios 6.安裝 Element Plus 7.gitee創建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、問題 1.README.md 文檔推送到gitee未自動換行 2.訪問login頁面顯示空白 3.表單輸入賬戶…

5G 模組 RG500Q常用AT命令

5G 模組 RG500Q常用AT命令 5G 模組 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…

NVIDIA DeepStream插件之Gst-nvtracker

NVIDIA DeepStream插件之Gst-nvtracker 1. 源由2. 基礎知識3. Gst-nvtracker插件3.1 插件參數3.2 插件API接口 4. 分析問題5. 總結6. 參考資料 1. 源由 這篇的主要目的是稍微吐槽下NVIDIA的設計&#xff0c;當然其實他們做的還是不錯的&#xff08;從系統架構設計角度看&#…

進程內存轉儲工具|內存鏡像提取-取證工具

1.內存轉儲&#xff0c;內存轉儲&#xff08;Memory Dump&#xff09;是將計算機的物理內存&#xff08;RAM&#xff09;內容復制到一個文件中的過程&#xff0c;這個文件通常被稱為“內存轉儲文件”或“核心轉儲文件”&#xff08;Core Dump&#xff09;,內存轉儲的主要目的是…

Lua語言入門 - Lua 面向對象

Lua 面向對象 面向對象編程&#xff08;Object Oriented Programming&#xff0c;OOP&#xff09;是一種非常流行的計算機編程架構&#xff0c;通過創建和操作對象來設計應用程序。 以下幾種編程語言都支持面向對象編程&#xff1a; CJavaObjective-CSmalltalkC#Ruby Lua 是…

Pyqt6在lineEdit中輸入文件名稱并創建或刪除JSON文件

1、創建JSON文件 代碼 import osdef addModulekeyWordFile(self):if "" ! self.lineEdit_module.text():moduleFile self.lineEdit_module.text() .jsonelse:self.toolLogPrinting(請輸入模塊名稱)returnfilePath modulekeyWordFileDir moduleFileif os.path.e…

【Leetcode 熱題 100】236. 二叉樹的最近公共祖先

問題背景 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 最近公共祖先的定義為&#xff1a;對于有根樹 T T T 的兩個節點 p p p、 q q q&#xff0c;最近公共祖先表示為一個節點 x x x&#xff0c;滿足 x x x 是 p p p、 q q q 的祖先且 x x x 的深度盡可能大…

數據結構--堆的向上調整和向下調整

文章目錄 1.完全二叉樹2.堆向上調整3.堆向下調整4.測試代碼 1.完全二叉樹 下面的這個就是對于我們的完全二叉樹的這個邏輯結構和物理結構的說明&#xff1a; 邏輯結構就是我們自己認為的進行購想出來的&#xff1b; 但是這個物理結構卻是我們的這個數據結構在內存里面的真是…

智能掛號系統設計典范:SSM 結合 Vue 在醫院的應用實現

摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了醫院預約掛號系統的開發全過程。通過分析醫院預約掛號系統管理的不足&#xff0c;創建了一個計算機管理醫院預約掛號系統的方案。文章介紹了醫院預約掛號系統的系…

“魔法糖果盒的秘密:用樸素貝葉斯算法猜糖果顏色”

想象一下&#xff0c;你有一個神奇的糖果盒&#xff0c;這個糖果盒里有兩種糖果&#xff1a;紅色的和藍色的。你閉上眼睛&#xff0c;從盒子里拿出一個糖果&#xff0c;然后嘗一嘗&#xff0c;你想知道這個糖果是紅色的還是藍色的。樸素貝葉斯算法就像是一個魔法規則&#xff0…

Transform組件的用法

文章目錄 1. 概念介紹2. 使用方法3. 示例代碼我們在上一章回中介紹了Checkbox Widget相關的內容,本章回中將介紹Transform Widget.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在這里說的Transform是一種容器類widget,它和Container組件類似。它可以包含其它的組件…

go面試問題

1 Go的內存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http狀態碼 300 請求的資源可包括多個位置&#xff0c;相應可返回一個資源特征與地址的列表用于用戶終端&#xff08;例如&#xff1a;瀏覽器&#xff09;選擇 301 永久移動。請求的資源已被永久的移動到新U…

康冠科技嵌入式面試題及參考答案

LCD 驅動你自己做了哪些內容? 在 LCD 驅動開發中,首先是硬件層面的理解。需要仔細研究 LCD 的數據手冊,明確其引腳定義,包括電源引腳、數據引腳、控制引腳等。比如,對于常見的 RGB 接口 LCD,要清楚哪幾個引腳是用于傳輸紅、綠、藍三種顏色的數據,以及像 VSYNC(垂直同步…

TouchGFX移植(5)增加觸屏驅動

一&#xff09;增加驅動代碼gt9xxx.c和ctiic.c到工程中的BSP目錄下: 二&#xff09;更改觸摸文件STM32TouchController.cpp 1&#xff09;在STM32TouchController.cpp文件中增加&#xff1a; #include “gt9xxx.h” 2&#xff09;增加gt9xxx_init(); void STM32TouchControlle…