Qt实现自定义QDoubleSpinBox软键盘

在Qt应用程序开发中,经常会遇到需要自定义输入控件的需求。其中,对于QDoubleSpinBox控件,如果希望在点击时弹出一个自定义的软键盘,以便用户输入数值,并将输入的值设置给QDoubleSpinBox,该如何实现呢?

在本文中,我们将介绍如何使用Qt框架,结合自定义的软键盘,实现一个可以在QDoubleSpinBox控件下方弹出的数字输入解决方案。我们将从头开始构建这个功能,并逐步引导您完成实现过程。

首先,我们将创建一个名为CustomDoubleSpinBox的自定义控件,它是QDoubleSpinBox的子类。我们将重写focusInEvent函数,该函数在QDoubleSpinBox获取焦点时被调用。在这个函数中,我们将创建并显示我们自己设计的软键盘CustomKeyboard,并确保它在QDoubleSpinBox的下方弹出。

接着,我们将继续创建CustomKeyboard类,它是一个继承自QWidget的自定义控件。在CustomKeyboard中,我们将实现一个数字键盘,允许用户输入数字,并在确认后返回输入的数值。

#ifndef CUSTOMKEYBOARD_H
#define CUSTOMKEYBOARD_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 

class CustomKeyboard : public QWidget
{
    Q_OBJECT

    public:
        explicit CustomKeyboard(QWidget *parent = nullptr);
        double getValue() const;

    signals:
        void confirmed(double);

    private:
        QString currentValue;
        QLabel *m_pCurrentLab;

    private slots:
        void on_digitButton_clicked();
        void on_decimalButton_clicked();
        void on_backspaceButton_clicked();
        void on_clearButton_clicked();
        void on_confirmButton_clicked();
        void on_closeButton_clicked();
    };

#endif // CUSTOMKEYBOARD_H

#include "customkeyboard.h"

CustomKeyboard::CustomKeyboard(QWidget *parent) : QWidget(parent)
{
    this->setWindowFlag(Qt::FramelessWindowHint);
    QVBoxLayout *layout = new QVBoxLayout;
        currentValue = "";
        m_pCurrentLab = new QLabel();

        QGridLayout *gridLayout = new QGridLayout;
        gridLayout->addWidget(m_pCurrentLab,0,0,1, 3);
        m_pCurrentLab->setStyleSheet("color:black");
        for (int i = 0; i <= 9; ++i)
        {
            QPushButton *digitButton = new QPushButton(QString::number(i));
            connect(digitButton, &QPushButton::clicked, this, &CustomKeyboard::on_digitButton_clicked);
            if(i == 9)
            {
                gridLayout->addWidget(digitButton, 4, 1);
            }
            else
                gridLayout->addWidget(digitButton, i / 3 +1, i % 3+1);
        }

        QPushButton *decimalButton = new QPushButton(".");
        connect(decimalButton, &QPushButton::clicked, this, &CustomKeyboard::on_decimalButton_clicked);
        gridLayout->addWidget(decimalButton, 4, 2);

        QPushButton *backspaceButton = new QPushButton("Backspace");
        connect(backspaceButton, &QPushButton::clicked, this, &CustomKeyboard::on_backspaceButton_clicked);
        gridLayout->addWidget(backspaceButton, 5, 2);

        QPushButton *clearButton = new QPushButton("Clear");
        connect(clearButton, &QPushButton::clicked, this, &CustomKeyboard::on_clearButton_clicked);
        gridLayout->addWidget(clearButton,4, 3);

        QPushButton *confirmButton = new QPushButton("Confirm");
        connect(confirmButton, &QPushButton::clicked, this, &CustomKeyboard::on_confirmButton_clicked);
        gridLayout->addWidget(confirmButton, 5, 1, 1, 1);

        QPushButton *closeButton = new QPushButton("Close");
        connect(closeButton, &QPushButton::clicked, this, &CustomKeyboard::on_closeButton_clicked);
        gridLayout->addWidget(closeButton, 5, 3, 1, 1);

        layout->addLayout(gridLayout);
        setLayout(layout);


        this->setStyleSheet("QLabel{font: 22px;color:white;}\
                            QPushButton{background-color:rgb(42, 49, 66);border: 1px solid rgb(206,206,206);border-radius: 5px;font:18px;Min-width:112px;Max-width:112px;Min-height:35px;color:white}\
                            QPushButton:hover{background-color:rgb(210,210,210);}\
                            QPushButton:pressed{background-color:rgb(160,160,160);}");
    }

    double CustomKeyboard::getValue() const
    {
        return currentValue.toDouble();
    }

    void CustomKeyboard::on_digitButton_clicked()
    {
        QPushButton *clickedButton = qobject_cast(sender());
        currentValue += clickedButton->text();
        m_pCurrentLab->setText(currentValue);
    }

    void CustomKeyboard::on_decimalButton_clicked()
    {
        if (!currentValue.contains('.'))
        {
            currentValue += '.';
        }
         m_pCurrentLab->setText(currentValue);
    }

    void CustomKeyboard::on_backspaceButton_clicked()
    {
        currentValue.chop(1);
         m_pCurrentLab->setText(currentValue);
    }

    void CustomKeyboard::on_clearButton_clicked()
    {
        currentValue = "0";
         m_pCurrentLab->setText(currentValue);
    }

    void CustomKeyboard::on_confirmButton_clicked()
    {
        emit confirmed(getValue());
    }

    void CustomKeyboard::on_closeButton_clicked()
    {
        this->close();
        this->deleteLater();
    }

在完成这两个自定义控件的设计后,我们将把它们组合在一起,实现自定义的QDoubleSpinBox软键盘功能。当用户点击QDoubleSpinBox控件时,我们的自定义软键盘将弹出,并在用户输入数字后自动设置给QDoubleSpinBox,使整个输入流程更加便捷和友好。

// customdoublespinbox.h

#ifndef CUSTOMDOUBLESPINBOX_H
#define CUSTOMDOUBLESPINBOX_H

#include 
#include "customkeyboard.h"

class CustomDoubleSpinBox : public QDoubleSpinBox
{
    Q_OBJECT

public:
    explicit CustomDoubleSpinBox(QWidget *parent = nullptr);

protected:
    void focusInEvent(QFocusEvent *event) override;

private:
    CustomKeyboard *keyboard;
};

#endif // CUSTOMDOUBLESPINBOX_H
// customdoublespinbox.cpp

#include "customdoublespinbox.h"
#include 
#include 
#include 

CustomDoubleSpinBox::CustomDoubleSpinBox(QWidget *parent) : QDoubleSpinBox(parent)
{
    // 初始化成员变量
    keyboard = nullptr;
}

void CustomDoubleSpinBox::focusInEvent(QFocusEvent *event)
{
    // 在QDoubleSpinBox获取焦点时弹出软键盘
    if (keyboard == nullptr)
    {
        // 获取主屏幕的尺寸
        QRect primaryScreenRect = QApplication::primaryScreen()->geometry();

        // 创建一个 CustomKeyboard 实例
        keyboard = new CustomKeyboard(this);
        connect(keyboard, &CustomKeyboard::confirmed, [this]() {
            // 从 CustomKeyboard 获取输入的值并设置给 QDoubleSpinBox
            double value = this->valueFromText(QString::number(keyboard->getValue()));
            this->setValue(value);
            keyboard->deleteLater(); // 关闭软键盘
        });

        // 将 CustomKeyboard 设置为 QDoubleSpinBox 的特殊键盘
        this->setSpecialValueText(" ");
        this->setKeyboardTracking(false);

        // 获取 QDoubleSpinBox 在主窗口中的位置
        QPoint spinBoxPos = this->mapToGlobal(QPoint(0, this->height()));

        // 设置 CustomKeyboard 在 QDoubleSpinBox 下方弹出
        keyboard->move(spinBoxPos.x(), spinBoxPos.y());
        keyboard->show();
    }

    QDoubleSpinBox::focusInEvent(event);
}

通过本文的介绍和示例代码,您将学会如何在Qt应用程序中实现自定义的QDoubleSpinBox软键盘功能。这将为您的应用程序带来更好的用户体验,并增加交互性。如果您对此功能感兴趣,可以参考本文提供的示例代码,并将其应用于您自己的项目中。

Qt实现自定义QDoubleSpinBox软键盘_第1张图片

 

希望本文对您有所帮助,并且能够在Qt应用程序开发中为您带来更多灵活、个性化的控件定制体验。如果您有任何问题或建议,欢迎在评论区留言,我们将竭诚为您解答。谢谢阅读!

你可能感兴趣的:(qt,开发语言)