文章详情
自定义Qt桌面软件密码盘-软键盘
Posted on 2021-08-02 12:03:42 by 主打一个C++
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