服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - Qt简单实现密码器控件

Qt简单实现密码器控件

2022-12-24 15:48RabbitChenc C/C++

这篇文章主要为大家详细介绍了Qt简单实现密码器控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

实现构思:

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

实现的效果:

Qt简单实现密码器控件

关于密码器控件的不足:

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

代码思路:

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

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

Qt简单实现密码器控件

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

Qt简单实现密码器控件

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

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

Qt简单实现密码器控件

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

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

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

源码实现:

calculaterform.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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();
 
}

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

原文链接:https://blog.csdn.net/GG802312/article/details/106838138

延伸 · 阅读

精彩推荐
  • C/C++c++中的bind使用方法

    c++中的bind使用方法

    bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用...

    xutopia6482022-08-10
  • C/C++C语言链表实现销售管理系统

    C语言链表实现销售管理系统

    这篇文章主要为大家详细介绍了C语言链表实现销售管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xjfyt7032022-10-09
  • C/C++VSCode如何使用最新的C++20(推荐)

    VSCode如何使用最新的C++20(推荐)

    这篇文章主要介绍了VSCode使用最新的C++20的相关知识,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要...

    LRolinx10692022-10-26
  • C/C++C++实现简单职工信息管理系统

    C++实现简单职工信息管理系统

    本文给大家分享的是使用C++实现简单的职工信息管理系统的代码,本系统采用了面向对象的程序设计方法,所有的方法均以类为基础,感兴趣的小伙伴们可...

    C++教程网5072021-03-05
  • C/C++c/c++中struct定义、声明、对齐方式解析

    c/c++中struct定义、声明、对齐方式解析

    这篇文章通过C/C++的两种声明方式开始,给大家详细分析了/c+中struct定义、声明、对齐方式,对此有兴趣的朋友可以参考学习下。...

    C语言教程网6272021-06-21
  • C/C++C#如何调用原生C++ COM对象详解

    C#如何调用原生C++ COM对象详解

    这篇文章主要给大家介绍了C#如何调用原生C++ COM对象,在C++中实现C#的接口。文中通过示例代码介绍的很详细,相信对大家的理解和学习会一定的参考借鉴...

    fyter3502021-04-22
  • C/C++C++深入探究引用的使用

    C++深入探究引用的使用

    引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍...

    Hiland.9812022-12-05
  • C/C++浅析C语言头文件和库的一些问题

    浅析C语言头文件和库的一些问题

    以下是对C语言中头文件和库的一些问题进行了详细的分析介绍,需要的朋友可以参考下...

    C语言教程网1882020-12-18