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

lyshark發表於2023-12-12

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()實現計算,效果圖如下;

相關文章