L o a d i n g . . .
主打一个C++
文章详情

自定义Qt桌面软件密码盘-软键盘

Posted on 2021-08-02 12:03:42 by 主打一个C++

qt动态生成软键盘代码

//一个小图

qt自制密码盘

//.h

#ifndef KEYBOARD_H

#define KEYBOARD_H
#include <QWidget>
#include <QLineEdit>
#include <QLabel>
#include <QToolButton>
#include <QMouseEvent>
#include <QDateTime>
#include <QDebug>

class Ckeyboard : public QWidget
{
public:
    //禁隐
    explicit Ckeyboard();
    ~Ckeyboard(){}
    QLineEdit* Q_QLineEdit;
private:
    void UI_SetText(QString _str);
    //重载事件过滤
    virtual bool eventFilter(QObject *watched, QEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
    QPoint h_MoveWindowPos;
    QString btn_style=(
                "QToolButton{border: 1px solid #f8fafb;"
                "font-size:18px;"
                "border-radius: 1px;"
                "background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #067eb5,stop:1 #000000);"
                "color:rgb(255, 255, 255);"
                "}"
                "QToolButton:hover{"
                "background-color:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #FF0000,stop:1 #000000);"
                "border: 1px solid #FFFFFF;"
                "}"
                "QToolButton:pressed{"
                "background-color:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #000000,stop:1 #FF0000);"
                "border: 1px solid #FFFFFF;"
                "}"
                );
    QString control_style=(
                "QToolButton{border: 1px solid #f8fafb;"
                "font-size:15px;"
                "border-radius: 1px;"
                "background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #067eb5,stop:1 #000000);"
                "color:rgb(255, 255, 255);"
                "}"
                "QToolButton:hover{"
                "background-color:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #FF0000,stop:1 #000000);"
                "border: 1px solid #FFFFFF;"
                "}"
                "QToolButton:pressed{"
                "background-color:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #000000,stop:1 #FF0000);"
                "border: 1px solid #FFFFFF;"
                "}"
                );
    QString lb_style=("QLabel{backgrund-color:argb(0, 0, 0, 0);"
                      "font-size:14px;"
                      "color:rgba(124, 124, 124,1);"
                      "border:0px"
                      "}"

                       );

    QLabel* lb_Title;
    bool h_small = true;                                //大写还是小写,默认小写
    int spacing = 3;                                    //间距
    int lb_WH = 24;                                     //普通按键宽高
    int char_spacing_left = 14,char_spacing_top = -8;	//数字上同位置字符间距,加法运算
    int lb_num_left = 30, lb_num_top = lb_WH+2;			//数字左边位置,顶边

    int lb_char_left = 57,lb_char_top = lb_WH + 30;		//符号
    int lb_left = 30, lb_top = lb_WH * 2 + 34;			//字母左边,定边

    QToolButton *lb_delete;
    QToolButton *lb_shift;
    QToolButton *lb_cLock;
    QToolButton *lb_close;
//第一部分
    QToolButton *lb_num[10] = {NULL};
    QString value_num[10]={"1","2","3","4","5","6","7","8","9","0"};
    QLabel* lb_charTOP[10]{ NULL };
    QString charTOP[10]={"!","@","#","$","%","^","&","*","(",")"};
//第二部分
    QToolButton *lb_char[10] = {NULL};
    QLabel *lb_char2[10] = {NULL};
    QString chars[10]={"[","]","-","=","'",",",".","/","\",";"};
    QString chars2[10]={"{","}","_","+",""","<",">","?","|",":"};
    //QString charsss[20]={"[","{","]","}","-","_","=","+","'",""",",","<",".",">","/","?","\","|",";",":"};//涉及随机,这样不友好
//第三部分
    QToolButton *lb_ABC[26] = {NULL};
    QString ABC[26] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    QString abc[26] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
//随机密码盘
    void RandArray(){
        qsrand(QDateTime::currentMSecsSinceEpoch());
        for (int i = 9;i > 0;i--) {
            int n = qrand() % i;
            if(n != i){
                value_num[i].swap(value_num[n]);
                charTOP[i].swap(charTOP[n]);
                //第二部分
                chars[i].swap(chars[n]);
                chars2[i].swap(chars2[n]);
            }
        }
        for (int i = 25;i > 0;i--) {
            int n = qrand() % i;
            if(n != i){
                ABC[i].swap(ABC[n]);
                abc[i].swap(abc[n]);
            }
        }
    }
};

#endif // KEYBOARD_H

//.cpp

#include "Ckeyboard.h"
Ckeyboard::Ckeyboard(){
	//随机密码盘
    RandArray();
    //title
    this->setWindowTitle("KeyBoard");
    //设置无边框固定大小
    setWindowFlag(Qt::FramelessWindowHint);
    setWindowFlag(Qt::WindowStaysOnTopHint);
    this->resize(405,140);
    setFixedSize(width(),height());

    this->setStyleSheet("QWidget{background-color:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #1b4956,stop:1 #000000);"
                        "border-style:solid;"
                        "border-width:2px;"
                        "border-color:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #1b4956,stop:1 #620114);"
                        "border-radius:0px;}"
                        );

    lb_Title = new QLabel(this);
    lb_Title->resize(width(),20);
    lb_Title->move(0,0);
    lb_Title->setText("Using Dynamic Floppy Disk");
    lb_Title->setStyleSheet("QLabel{color:#FF0000;border:0px;font: 8pt "迷你简琥珀";}");
    lb_Title->setAlignment(Qt::AlignCenter);

    lb_delete = new QToolButton(this);
    lb_shift = new QToolButton(this);
    lb_cLock = new QToolButton(this);
    lb_close = new QToolButton(this);
    //数字
    for (int i = 0;i<10;i++){
        //qDebug()<<n;
        lb_num[i]=new QToolButton(this);
        lb_num[i]->resize(lb_WH,lb_WH);
        lb_num[i]->move(lb_num_left,lb_num_top);
        lb_num[i]->setStyleSheet(btn_style);
        lb_num[i]->setText(value_num[i] + " ");//QString::number(i) +
        lb_num[i]->setObjectName(value_num[i]);//*设置专属名字
        connect(lb_num[i],&QToolButton::clicked,this,[=](){
            UI_SetText(lb_num[i]->objectName());
        });

        //数字上的字符
        lb_charTOP[i]= new QLabel(this);
        lb_charTOP[i]->resize(lb_WH,lb_WH);
        lb_charTOP[i]->move(lb_num_left+char_spacing_left,lb_num_top+char_spacing_top);
        lb_charTOP[i]->setStyleSheet(lb_style);
        lb_charTOP[i]->setAlignment(Qt::AlignBottom);
        lb_charTOP[i]->setAttribute(Qt::WA_TransparentForMouseEvents);//穿透
        lb_charTOP[i]->setAttribute(Qt::WA_TranslucentBackground);//透明
        QString cmp = charTOP[i];
        lb_charTOP[i]->setText(cmp);
        lb_charTOP[i]->setObjectName(charTOP[i]);//*设置专属名字

        lb_num_left+=lb_WH+spacing;
    }

    //中间部分字符
    for (int i = 0;i<10;i++){
        lb_char[i]=new QToolButton(this);
        lb_char[i]->resize(lb_WH,lb_WH);
        lb_char[i]->move(lb_char_left,lb_char_top);
        lb_char[i]->setStyleSheet(btn_style);
        lb_char[i]->setText(chars[i] + " ");
        lb_char[i]->setObjectName(chars[i]);//*设置专属名字
        connect(lb_char[i],&QToolButton::clicked,this,[=](){
            UI_SetText(lb_char[i]->objectName());
            //qDebug()<<lb_char[i];
        });
        lb_char2[i]=new QLabel(this);
        lb_char2[i]->resize(lb_WH,lb_WH);
        lb_char2[i]->move(lb_char_left+char_spacing_left,lb_char_top + char_spacing_top);
        lb_char2[i]->setStyleSheet(lb_style);
        lb_char2[i]->setAlignment(Qt::AlignBottom);
        lb_char2[i]->setAttribute(Qt::WA_TransparentForMouseEvents);
        lb_char2[i]->setAttribute(Qt::WA_TranslucentBackground);
        lb_char2[i]->setText(chars2[i]);

        //lb_char2[i]->setObjectName(chars2[i]);//*设置专属名字
        lb_char_left+=lb_WH+spacing;
    }

    //字母
    for (int i = 0;i<26;i++) {
        lb_ABC[i]=new QToolButton(this);
        lb_ABC[i]->resize(lb_WH,lb_WH);
        if(i == 13){
            lb_left = 30;
            lb_top+=lb_WH+spacing;
        }
        lb_ABC[i]->move(lb_left,lb_top);
        lb_ABC[i]->setStyleSheet(btn_style);
        lb_left+=lb_WH+spacing;
        lb_ABC[i]->setText(abc[i]);
        lb_ABC[i]->setObjectName(abc[i]);//*设置专属名字
        connect(lb_ABC[i],&QToolButton::clicked,this,[=](){
            UI_SetText(lb_ABC[i]->objectName());
            //qDebug()<<lb_ABC[i];
        });
    }
    //删除键
    lb_delete->resize(lb_WH * 2.5,lb_WH);
    lb_delete->move(lb_num_left,lb_num_top);
    lb_delete->setStyleSheet(btn_style);
    lb_delete->setText(u8"←");
    lb_delete->setObjectName("delete");//*设置专属名字
    connect(lb_delete,&QToolButton::clicked,this,[=](){
        UI_SetText(lb_delete->objectName());
        //qDebug()<<lb_delete;
    });

    //关闭键盘按钮
    lb_close->resize(lb_WH,lb_WH);
    lb_close->move(lb_num_left + lb_WH * 3,lb_num_top);
    lb_close->setStyleSheet("background-color:argb(255,255,0,0);"
                            "border:0px;"
                            "color:#FFFFFF;"
                            );
    lb_close->setText(u8"×");
    lb_close->setObjectName("close");//*设置专属名字
    connect(lb_close,&QToolButton::clicked,this,[=](){
        this->close();
        //qDebug()<<lb_delete;
    });

    //lb_shift
    lb_shift ->resize(lb_WH * 2,lb_WH);
    lb_shift->move(5,lb_char_top);
    lb_shift->setStyleSheet(control_style);
    lb_shift->setText("Shift");
    lb_shift->setObjectName("Shift");//*设置专属名字
    connect(lb_shift,&QToolButton::clicked,this,[=](){
        //转换大小写
        this->h_small = !this->h_small;
        if(this->h_small == false){
            //全部转为大写
            for (int i = 0;i<26;i++) {
                lb_ABC[i]->setText(ABC[i]);
                lb_ABC[i]->setObjectName(ABC[i]);//*设置专属名字
            }
            //切换顶部数字为符号
            for (int i = 0;i<10;i++) {
                //数字-》字符
                QString ands = charTOP[i];//&符号有毒
                if("&" == ands){
                    ands = "&&";
                }
                lb_num[i]->setText(ands + " ");
                lb_charTOP[i]->setText(value_num[i]);
                lb_num[i]->setObjectName(QString(charTOP[i]));//*设置专属名字

                //都是十个,一次循环利用
                //中间符号
                lb_char[i]->setText(chars2[i] + " ");
                lb_char2[i]->setText(chars[i]);
                lb_char[i]->setObjectName(QString(chars2[i]));//*设置专属名字
                lb_shift->setStyleSheet("QToolButton{background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #FF0000,stop:1 #FF0000);color:#FFFFFF}");

            }
        }else{
            for (int i = 0;i<26;i++) {
                lb_ABC[i]->setText(abc[i]);
                lb_ABC[i]->setObjectName(abc[i]);//*设置专属名字
            }
            //切换顶部符号为数字
            for (int i = 0;i<10;i++) {
                lb_num[i]->setText(value_num[i] + " ");
                QString ands = charTOP[i];//&符号有毒
                lb_charTOP[i]->setText(ands);
                lb_num[i]->setObjectName(value_num[i]);//*设置专属名字

                //都是十个,一次循环利用
                //中间符号
                lb_char[i]->setText(chars[i] + " ");
                lb_char2[i]->setText(chars2[i]);
                lb_char[i]->setObjectName(QString(chars[i]));//*设置专属名字
            }

            lb_shift->setStyleSheet(control_style);
        }
    });

    //lb_cLock
    lb_cLock ->resize(lb_WH * 3,lb_WH);
    lb_cLock->move(lb_char_left,lb_char_top);
    lb_cLock->setStyleSheet(control_style);
    lb_cLock->setText("Empty");
    lb_cLock->setObjectName("Empty");//*设置专属名字
    connect(lb_cLock,&QToolButton::clicked,this,[=](){
        UI_SetText(lb_cLock->objectName());
        //qDebug()<<lb_cLock;
    });

}

void Ckeyboard::UI_SetText(QString _str){
    QString str = Q_QLineEdit->text();
    if(_str == "Shift"){

    }else if(_str == "delete"){
        str = str.left(str.length()-1);

    }else if(_str == "Empty"){
        str = "";
    }else{
        str += _str;
    }
    Q_QLineEdit->setText(str);//lineEdit_name
}

bool Ckeyboard::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type() == QEvent::MouseButtonPress){

    }
    return QWidget::eventFilter(watched,event);
}
void Ckeyboard::mouseMoveEvent(QMouseEvent *event)

{
    //qDebug()<<event->globalPos();//得到的是整个屏幕的相对坐标
    if(h_MoveWindowPos.y() > 20){
        return;
    }
    this->move(event->globalPos() - h_MoveWindowPos);

}
//按下鼠标
void Ckeyboard::mousePressEvent(QMouseEvent *event)
{

    h_MoveWindowPos = event->globalPos() - this->pos();
    //qDebug()<<h_MoveWindowPos;
}
//放开
void Ckeyboard::mouseReleaseEvent(QMouseEvent *event){
    //qDebug()<<h_MoveWindowPos;
    h_MoveWindowPos.setY(21);
}

//简单使用示例

//引入密码盘
Ckeyboard* g_keyBoard = new Ckeyboard();
//直接暴力接收输入
g_keyBoard ->Q_QLineEdit=ui->你的密码输入框类名;



*转载请注明出处:原文链接:https://cpp.vin/page/6.html

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog