如何用qt实现虚拟数字小键盘

先上效果图

在这里插入图片描述

//main.cpp
#include <QApplication>
#include "./mainpage.h"
#include "./keyboard.h"

int main(int argc, char **args)
{
    // 创建对象
    QApplication *app = new QApplication(argc, args);
    MainPage *mainpage = new MainPage();

    // 安装事件过滤器
    app->installEventFilter(mainpage);

    // 显示界面
    mainpage->show();
    return app->exec();
}
//mainpage.cpp
#include "mainpage.h"
#include "ui_mainpage.h"

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

    ui->spinBox_1->setRange(0, 9999999);
    ui->spinBox_2->setRange(0, 9999999);

    // 打开键盘
    connect(ui->pushButton_openKeyboard, &QPushButton::clicked, this,
            [=]()
            {
                m_keyboard.show();
            });
}

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

bool MainPage::eventFilter(QObject *obj, QEvent *e)
{
    if (e->type() == QEvent::FocusIn)
    {
        if (obj == ui->spinBox_1)
        {
            SELECTED_SPINBOX = ui->spinBox_1;
            printf("1\n");
        }
        else if (obj == ui->spinBox_2)
        {
            SELECTED_SPINBOX = ui->spinBox_2;
            printf("2\n");
        }
    }
    return QObject::eventFilter(obj, e);
}

//mainpage.h
#ifndef MAINPAGE_H
#define MAINPAGE_H

#include <QWidget>
#include "./keyboard.h"

namespace Ui
{
    class MainPage;
}

class MainPage : public QWidget
{
    Q_OBJECT

public:
    explicit MainPage(QWidget *parent = nullptr);
    ~MainPage();

    bool eventFilter(QObject *obj, QEvent *e) override;

private:
    Ui::MainPage *ui;
    Keyboard m_keyboard;
};

#endif // MAINPAGE_H

//keyboard.cpp
#include "keyboard.h"
#include "ui_keyboard.h"

QSpinBox *SELECTED_SPINBOX;

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

    // 窗口总在最前
    this->setWindowFlag(Qt::WindowStaysOnTopHint);

    connect(ui->pushButton_0, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_1, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_2, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_3, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_4, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_5, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_6, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_7, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_8, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_9, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_point, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_backSpace, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
    connect(ui->pushButton_confirm, &QPushButton::clicked, this, &Keyboard::ButtonClickedHandler);
}

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

void Keyboard::ButtonClickedHandler()
{
    QString senderName = ((QPushButton *)sender())->text();

    if (SELECTED_SPINBOX == NULL)
        return;
    if (senderName == "退格")
    {
        int value = SELECTED_SPINBOX->value();
        value /= 10;
        SELECTED_SPINBOX->setValue(value);
    }
    else if (senderName == "确定")
    {
        this->close();
    }
    else if (senderName == ".")
    {
    }
    else
    {
        int value = SELECTED_SPINBOX->value();
        value *= 10;
        value += senderName.toInt();
        SELECTED_SPINBOX->setValue(value);
    }
}

//keyboard.h
#ifndef KEYBOARD_H
#define KEYBOARD_H

#include <QWidget>
#include <QSpinBox>

extern QSpinBox* SELECTED_SPINBOX;

namespace Ui {
class Keyboard;
}

class Keyboard : public QWidget
{
    Q_OBJECT

public:
    explicit Keyboard(QWidget *parent = nullptr);
    ~Keyboard();

    void ButtonClickedHandler();//按钮按下处理函数

private:
    Ui::Keyboard *ui;
};

#endif // KEYBOARD_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值