Qt简单实现密码器控件

 更新时间:2022-06-15 10:15:35   作者:佚名   我要评论(0)

本文实例为大家分享了Qt自定义一个密码器控件的简单实现代码,供大家参考,具体内容如下
实现构思:
密码器的功能可以看成是计算器和登陆界面

本文实例为大家分享了Qt自定义一个密码器控件的简单实现代码,供大家参考,具体内容如下

实现构思:

密码器的功能可以看成是计算器和登陆界面的组合,所以在实现功能的过程中借鉴了大神的计算器的实现代码和登陆界面实现的代码。

实现的效果:

关于密码器控件的不足:

窗口的标题栏不够漂亮,但是由于对时间长度和任务进度的权衡,下次一定进行重绘。

代码思路:

由于我司不用样式表,所以背景由贴图函数完成。在widget中添加按钮控件和文本编辑控件。使用布局函数进行布局,在加上一些简单的逻辑处理功能即可。

首先创建一个工程文件,添加新文件,选择qt 设计师界面类,如下:

进入创建的ui界面后,添加控件进行布局,单一的使用了珊格布局,如下:

在自定义控件的布局中遇到了一些与布局相关的问题:

问题1:如何改变布局内控件的大小? ui中修改方式如下,纯代码实现也可以去帮助手册中查找相同的接口函数。

问题2:布局中控件的位置如何进行更改?

*ui->gridLayout->setContentsMargins(QMargins(10,60,0,0));
ui->gridLayout->setVerticalSpacing(10);*

具体size,自行可以调整到比较合适的位置。

源码实现:

calculaterform.h

#define CALCULATERFORM_H
#include "calacutorbutton.h"
#include <QWidget>
#include <QLineEdit>

namespace Ui {
class CalculaterForm;
}

class CalculaterForm : public QWidget
{
? ? Q_OBJECT

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

? ? ?void ?addLineEdit();
? ? ?void addBackImg();//可以进行提供一个背景图片
private slots:

? ? void on_pushButton_clicked(bool checked);

? ? void on_pushButton_2_clicked(bool checked);

? ? void on_pushButton_3_clicked(bool checked);

? ? void on_pushButton_4_clicked(bool checked);

? ? void on_pushButton_5_clicked(bool checked);

? ? void on_pushButton_6_clicked(bool checked);

? ? void on_pushButton_7_clicked(bool checked);

? ? void on_pushButton_8_clicked(bool checked);

? ? void on_pushButton_9_clicked(bool checked);

? ? void on_pushButton_10_clicked(bool checked);

? ? void on_pushButton_11_clicked(bool checked);

? ? void on_pushButton_12_clicked(bool checked);

? ? void on_pushButton_13_clicked(bool checked);

? ? void on_pushButton_15_clicked(bool checked);

? ? void on_pushButton_14_clicked(bool checked);

private:
? ? Ui::CalculaterForm *ui;
? ? float mNum1,mNum2,mResult;
? ? char mSign;
? ? int mMark;
? ? QString mKeyStr = "0000";//密码字符串
? ? QString S;
? ? QLineEdit *mLineEdit;

};

#endif // CALCULATERFORM_H

calculaterform.cpp

#include "calculaterform.h"
#include "ui_calculaterform.h"
#include <QLineEdit>
#include <QDebug>
#include <QMessageBox>
CalculaterForm::CalculaterForm(QWidget *parent) :
? ? QWidget(parent),
? ? ui(new Ui::CalculaterForm)
{
? ? ui->setupUi(this);
? ? mNum1 = 0.0;
? ? mNum2 = 0.0;
? ? mResult = 0.0;
? ? S="";
? ? mMark=1;
? ? ui->pushButton_13->setMyIcon("/home/rabbitchenc/Image/dialog_cancel.png");
? ? ui->pushButton_14->setMyIcon("/home/rabbitchenc/Image/ime_icon_del.png");
? ? ui->pushButton_15->setMyIcon("/home/rabbitchenc/Image/dialog_ok.png");
? ? mLineEdit = new QLineEdit(this);
? ? setFixedSize(width(),height());
? ? ui->gridLayout->setContentsMargins(QMargins(10,60,0,0));
? ? ui->gridLayout->setVerticalSpacing(10);
? ? addBackImg();
? ? addLineEdit();
? ? ui->pushButton_10->setEnabled(false);
? ? ui->pushButton_12->setEnabled(false);
}

//添加文本编辑
void ?CalculaterForm::addLineEdit()
{
? ? if(mLineEdit != nullptr){
? ? ? ? mLineEdit->resize(width(),40);
? ? ? ? mLineEdit->setStyleSheet("background:transparent;border-width:0;border-style:outset");
? ? ? ? mLineEdit->setAlignment(Qt::AlignHCenter);
? ? ? ? mLineEdit->setEchoMode(QLineEdit::Password);
? ? }
}
//添加背景图片
void CalculaterForm::addBackImg()
{
? ? QString filename = "/home/rabbitchenc/Image/ime_bg.png";
? ? QPixmap pixmap(filename);
? ? QPalette pal;
? ? pixmap = pixmap.scaled(width(),height());
? ? pal.setBrush(QPalette::Window,QBrush(pixmap));
? ? setPalette(pal);

}

CalculaterForm::~CalculaterForm()
{
? ? delete ui;
}

void CalculaterForm::on_pushButton_clicked(bool checked)
{
? ? S += "1";
? ? mLineEdit->setText(S);

}

void CalculaterForm::on_pushButton_2_clicked(bool checked)
{
? ? S += "2";
? ? mLineEdit->setText(S);

}

void CalculaterForm::on_pushButton_3_clicked(bool checked)
{
? ? S += "3";
? ? mLineEdit->setText(S);
}

void CalculaterForm::on_pushButton_4_clicked(bool checked)
{
? ? S += "4";
? ? mLineEdit->setText(S);

}

void CalculaterForm::on_pushButton_5_clicked(bool checked)
{
? ? S += "5";
? ? mLineEdit->setText(S);
}

void CalculaterForm::on_pushButton_6_clicked(bool checked)
{
? ? S += "6";
? ? mLineEdit->setText(S);

}

void CalculaterForm::on_pushButton_7_clicked(bool checked)
{
? ? S += "7";
? ? mLineEdit->setText(S);

}

void CalculaterForm::on_pushButton_8_clicked(bool checked)
{
? ? S += "8";
? ? mLineEdit->setText(S);
}

void CalculaterForm::on_pushButton_9_clicked(bool checked)
{
? ? S += "9";
? ? mLineEdit->setText(S);
}

void CalculaterForm::on_pushButton_10_clicked(bool checked)
{

}

void CalculaterForm::on_pushButton_11_clicked(bool checked)
{
? ? S += "0";
? ? mLineEdit->setText(S);
}

void CalculaterForm::on_pushButton_12_clicked(bool checked)
{

}

void CalculaterForm::on_pushButton_13_clicked(bool checked)
{
? ? this->close();
}

void CalculaterForm::on_pushButton_15_clicked(bool checked)
{

? ? if(S == mKeyStr)
? ? {
? ? ? ? qDebug() << "right";
? ? ? ? this->close();
? ? }else{
? ? ? ? qDebug() << "false";
? ? ? ? QMessageBox *messageBox = new QMessageBox(QMessageBox::Warning,"错误提示","密码错误");
? ? ? ? messageBox->show();
? ? }
}
void CalculaterForm::on_pushButton_14_clicked(bool checked)
{
? ? S = S.left(S.length() - 1);
? ? mLineEdit->setText(S);
}

自定义的按钮源码:
calacutorbutton.h

#ifndef CALACUTORBUTTON_H
#define CALACUTORBUTTON_H
#include <QPushButton>

class CalacutorButton: public QPushButton
{
? ? Q_OBJECT

public:

? ? explicit CalacutorButton(QWidget *parent = nullptr);
? ? ~CalacutorButton();
? ? void setText(const QString&text);
? ? void setMyIcon(const QString&icon);
? ? void setImageName(const QString&img);
? ? void setPressImg(const QString&img);

protected:
? ? void paintEvent(QPaintEvent *event);
? ? void drawText(QPainter *painter);
? ? void drawImage(QPainter*painter);
? ? void drawIcon(QPainter*painter);
? ? QPixmap* ninePatch(QString picName,double iHorzSplit,double iVertSplit, double DstWidth, double DstHeight);
? ? QPixmap generatePixmap(const QPixmap& img_in, int radius1,int radius2);

private:
? ? QString ?mFileName;
? ? QString mPressImgName;
? ? QString mNormalImgName;
? ? QString mFocusImgName;
? ? QString mDisableName;
? ? QString mText;
? ? QString mIcon;
? ? int mWidth;
? ? int mHeight;
? ? bool pressed;
};

#endif // CALACUTORBUTTON_H

calacutorbutton.cpp

#include "calacutorbutton.h"

#include <QPainter>
#include <QBitmap>
#include <QMouseEvent>
#include <QSizePolicy>

//增加对按钮类型的设定
//按钮控件中缺少
CalacutorButton::CalacutorButton(QWidget *parent):QPushButton(parent)
{
? ? pressed = false;
? ? mText = "";
? ? mIcon = "";
? ? mPressImgName = "/home/rabbitchenc/Image/btn_ime.png";
? ? mNormalImgName = "";//不添加图片背景
? ? mFocusImgName = "";
? ? mDisableName = "";
? ? mFileName = mNormalImgName;


? ? connect(this,&QPushButton::pressed,[=](){
? ? ? ? pressed = true;
? ? ? ? setImageName(mPressImgName);

? ? });

? ? connect(this,&QPushButton::released,[=](){

? ? ? ? pressed = false;
? ? ? ? setImageName(mNormalImgName);
? ? });
}

CalacutorButton::~CalacutorButton()
{

}

void CalacutorButton::paintEvent(QPaintEvent *event)
{
?QPainter painter(this);
?painter.setRenderHint(QPainter::Antialiasing);
?painter.setRenderHint(QPainter::TextAntialiasing);
?drawImage(&painter);
?drawText(&painter);
?drawIcon(&painter);

}
void CalacutorButton::drawImage(QPainter*painter)
{
? ? painter->save();
? ? QPixmap pixmap;
? ? mWidth = width();
? ? mHeight = height();

? ? if(isEnabled()){
? ? ? ? if(isCheckable()){
? ? ? ? ? ? if(isChecked()){
? ? ? ? ? ? ? ? mFileName = mPressImgName;
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? mFileName = mNormalImgName;
? ? ? ? ? ? }
? ? ? ? ? ? if(pressed){
? ? ? ? ? ? ? ? mFileName = mFocusImgName;
? ? ? ? ? ? }
? ? ? ? }
? ? }else {
// ? ? ? ?mFileName = mDisableName;
}

? ? pixmap = QPixmap( mFileName);
? ? painter->drawPixmap(0,0,mWidth,mHeight,pixmap);
? ? painter->restore();
}

?//添加文字
? void CalacutorButton::drawText(QPainter *painter)
? {
? ? ? painter->save();
? ? ? QFont font = painter->font();
? ? ? painter->drawText(0,0,mWidth,mHeight,Qt::AlignCenter,mText);
? ? ? painter->restore();
? }

? //添加图标
? void CalacutorButton::drawIcon(QPainter*painter)
? {
? ? ? painter->save();

? ? ? QPixmap pixmap(mIcon);
? ? ? if(pressed){
? ? ? ? ? painter->drawPixmap((width()-pixmap.width())/2,(height()-pixmap.height())/2,pixmap.width(),pixmap.height(),pixmap);
? ? ? }else{
? ? ? ? ? painter->drawPixmap((width()-pixmap.width())/2,(height()-pixmap.height())/2,pixmap.width(),pixmap.height(),pixmap);
? ? ? }

? ? ? painter->restore();
? }

?void CalacutorButton::setText(const QString&text)
?{
? ? ?mText = text;
? ? ?update();
?}


void CalacutorButton::setMyIcon(const QString &icon)
{
? ? mIcon = icon;
? ? update();
}
void CalacutorButton::setImageName(const QString &img)
{
? ? mFileName = img;

? ? update();
}


void CalacutorButton::setPressImg(const QString&img)
{
? ? mPressImgName = img;

? ? update();

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • Qt实现密码显示按钮
  • Qt实现密码框
  • Qt编写显示密码强度的控件
  • Qt实现解压带有密码的加密文件
  • pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
  • pyqt 实现QlineEdit 输入密码显示成圆点的方法

相关文章

  • Qt简单实现密码器控件

    Qt简单实现密码器控件

    本文实例为大家分享了Qt自定义一个密码器控件的简单实现代码,供大家参考,具体内容如下 实现构思: 密码器的功能可以看成是计算器和登陆界面
    2022-06-15
  • 微信小程序使用ECharts的示例详解

    微信小程序使用ECharts的示例详解

    目录安装 ECharts 组件使用 ECharts 组件图表延迟加载echarts-for-weixin 是 ECharts 官方维护的一个开源项目,提供了一个微信小程序组件(C
    2022-06-15
  • 5个实用的JavaScript新特性

    5个实用的JavaScript新特性

    目录前言1.# 使用"Object.hasOwn"替代“in”操作符2.# 使用"#"声明私有属性3.# 超有用的"数字分隔符"4.# 使用"?."简化"&&"和三元运
    2022-06-15
  • 解决@Scope(“prototype“)不生效的问题

    解决@Scope(“prototype“)不生效的问题

    目录@Scope(“prototype“)不生效@Scope(“prototype“)正确用法——解决Bean多例问题1.问题,Spring管理的某
    2022-06-15
  • QT实现用户登录注册功能

    QT实现用户登录注册功能

    本文实例为大家分享了QT实现用户登录注册的具体代码,供大家参考,具体内容如下 1、login.h #ifndef LOGIN_H #define LOGIN_H #include <QW
    2022-06-15
  • C#使用LINQ查询操作符实例代码(二)

    C#使用LINQ查询操作符实例代码(二)

    目录六、连表操作符1、内连接2、左外连接(DefaultIfEmpty)3、组连接七、集合操作八、分区操作符1、Take():2、TakeWhile():3、Skip():4、S
    2022-06-15
  • Golang泛型与反射的应用详解

    Golang泛型与反射的应用详解

    目录1. 泛型1.1 定义1.2 例子1.3 自定义泛型类型1.4 泛型与switch结合使用1.5 泛型实战2. 反射2.1 定义2.2 方法2.3 反射读取2.4 反射操作2.5
    2022-06-15
  • C#使用Clipboard类实现剪贴板功能

    C#使用Clipboard类实现剪贴板功能

    剪贴板是Windows操作系统中最常用的功能之一,它用来从一个应用程序向另一个应用程序传递数据,可以是文本,图象,甚至是程序对象。 不过剪贴
    2022-06-15
  • 面试手写实现Promise.all

    面试手写实现Promise.all

    目录前言常见面试手写系列Promise.resolve简要回顾源码实现Promise.reject简要回顾源码实现Promise.all简要回顾源码实现Promise.allSettled简
    2022-06-15
  • Java中String和StringBuffer及StringBuilder?有什么区别

    Java中String和StringBuffer及StringBuilder?有什么区别

    目录String类为什么是immutable(不可变的)如何保证不可变string类为不可变对象的好处前言: String 是 Java 语言非常基础和重要的类,提供了
    2022-06-15

最新评论