C++ Qt開發:SpinBox數值微調框組件

Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹QSpinBox精度數值組件的常用方法及靈活運用。

QSpinBox是Qt框架中的一個部件(Widget),用於提供一個方便用戶輸入整數值的界面元素。它通常以微調框(SpinBox)的形式展現,用戶可以通過微調框上的按鈕或手動輸入來增加或減少整數值。在實際使用中該控件主要用於整數或浮點數的計數顯示,與普通的LineEdit組件不同,該組件可以在前後增加特殊符號並提供了上下幅度的調整按鈕,靈活性更強。

使用場景:

  • 數值輸入: 適用於需要用戶輸入整數值的場景,如設置參數、調整數量等。
  • 調整參數: 在需要進行微小調整的地方,提供直觀的增減按鈕。
  • 限制輸入範圍: 當需要確保用戶輸入在一定範圍內時,可設置最小值和最大值。
  • 只讀展示: 可以用於只讀展示某個數值,不允許用戶修改。

以下是QSpinBox類的一些常用方法,說明並概述成表格:

方法 描述
QSpinBox(QWidget *parent = nullptr) 構造函數,創建一個整數微調框。
int value() const 獲取當前微調框中的整數值。
void setValue(int value) 設置微調框的整數值。
int minimum() const 獲取微調框的最小值。
void setMinimum(int min) 設置微調框的最小值。
int maximum() const 獲取微調框的最大值。
void setMaximum(int max) 設置微調框的最大值。
int singleStep() const 獲取單步步進值,即微調框在每次增減操作時的變化量。
void setSingleStep(int step) 設置單步步進值。
int prefix() const 獲取前綴(顯示在值之前的文本)。
void setPrefix(const QString &prefix) 設置前綴。
int suffix() const 獲取後綴(顯示在值之後的文本)。
void setSuffix(const QString &suffix) 設置後綴。
QString cleanText() const 獲取文本表示的乾淨值,即不包含前綴和後綴的純文本值。
bool wrapping() const 檢查微調框是否啓用了循環,即在達到最大或最小值時是否繞回。
void setWrapping(bool on) 啓用或禁用微調框的循環。
void stepUp() 將微調框的值增加一個單步步進值。
void stepDown() 將微調框的值減少一個單步步進值。
void setAccelerated(bool on) 啓用或禁用加速,即按住上下箭頭時值的變化速度是否逐漸加快。
bool isAccelerated() const 檢查是否啓用了加速。
void setReadOnly(bool ro) 設置微調框爲只讀模式,禁止用戶編輯值。
bool isReadOnly() const 檢查微調框是否爲只讀模式。
void setAlignment(Qt::Alignment align) 設置微調框中文本的對齊方式。
Qt::Alignment alignment() const 獲取微調框中文本的對齊方式。
void setButtonSymbols(QAbstractSpinBox::ButtonSymbols bs) 設置增減按鈕的顯示方式。
QAbstractSpinBox::ButtonSymbols buttonSymbols() const 獲取增減按鈕的顯示方式。

這些方法涵蓋了QSpinBox類中一些常用的設置和獲取整數微調框屬性的功能。

接下來我將用一個簡單的案例展示如何使用SpinBox組件,該組件有兩個版本SpinBox()用於展示單精度浮點數,而DoubleSpinBox()則可以展示精度更高的數值,需要注意的是,該組件有兩個特殊參數,當使用setPrefix()時可以指定在前方加入特殊符號,而使用setSuffix()時則可以在後方追加特殊符號,我們就以後方追加爲例,首先繪製一個窗體;

要實現計算流程很簡單,只需要在按鈕被觸發時直接調用on_pushButton_clicked()按鈕事件即可,其核心代碼如下所示;

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 在組件後方設置$特殊符號
    ui->spinBox->setSuffix(" $");
    ui->spinBox_2->setSuffix(" $");
    ui->doubleSpinBox->setSuffix(" $");

    // 設置顯示精度
    ui->doubleSpinBox->setDecimals(6);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 觸發計算流程
void MainWindow::on_pushButton_clicked()
{
     int x = ui->spinBox->value();
     int y = ui->spinBox_2->value();

     double total = x+y;
     // 設置SpinBox數值(設置時無需轉換)
     ui->doubleSpinBox->setValue(total);
}

我們繼續在SpinBox的基礎上改進,如上代碼中每次都需要點擊計算按鈕才能出結果,此時的需求是當SpinBox中的參數發生變化時自定的完成計算,這裏就需要用到信號和槽了,當SpinBox被修改後,自動觸發計算信號實現計算。該需求很容易被實現,只需要將信號綁定到特定的槽函數上即可,核心代碼如下所示;

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 在組件後方設置$特殊符號
    ui->spinBox->setSuffix(" $");
    ui->spinBox_2->setSuffix(" $");
    ui->doubleSpinBox->setSuffix(" $");

    // 設置顯示精度
    ui->doubleSpinBox->setDecimals(6);

    // 始終不可編輯
    ui->doubleSpinBox->setEnabled(false);

    // 將數量和單價兩個SpinBox的valueChanged()信號與on_pushButton_clicked()槽關聯
    // 只要spinBox中的內容發生變化,則立即觸發按鈕完成計算
    QObject::connect(ui->spinBox,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));
    QObject::connect(ui->spinBox_2,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));
    QObject::connect(ui->doubleSpinBox,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));
}

編譯並運行上述程序,當我們的兩個選擇框其中一個發生變化時,都會自動觸發信號與on_pushButton_clicked()實現計算,效果圖如下;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章