Qt簡(jiǎn)單實(shí)現(xiàn)密碼器控件
本文實(shí)例為大家分享了Qt自定義一個(gè)密碼器控件的簡(jiǎn)單實(shí)現(xiàn)代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)構(gòu)思:
密碼器的功能可以看成是計(jì)算器和登陸界面的組合,所以在實(shí)現(xiàn)功能的過(guò)程中借鑒了大神的計(jì)算器的實(shí)現(xiàn)代碼和登陸界面實(shí)現(xiàn)的代碼。
實(shí)現(xiàn)的效果:
關(guān)于密碼器控件的不足:
窗口的標(biāo)題欄不夠漂亮,但是由于對(duì)時(shí)間長(zhǎng)度和任務(wù)進(jìn)度的權(quán)衡,下次一定進(jìn)行重繪。
代碼思路:
由于我司不用樣式表,所以背景由貼圖函數(shù)完成。在widget中添加按鈕控件和文本編輯控件。使用布局函數(shù)進(jìn)行布局,在加上一些簡(jiǎn)單的邏輯處理功能即可。
首先創(chuàng)建一個(gè)工程文件,添加新文件,選擇qt 設(shè)計(jì)師界面類(lèi),如下:
進(jìn)入創(chuàng)建的ui界面后,添加控件進(jìn)行布局,單一的使用了珊格布局,如下:
在自定義控件的布局中遇到了一些與布局相關(guān)的問(wèn)題:
問(wèn)題1:如何改變布局內(nèi)控件的大??? ui中修改方式如下,純代碼實(shí)現(xiàn)也可以去幫助手冊(cè)中查找相同的接口函數(shù)。
問(wèn)題2:布局中控件的位置如何進(jìn)行更改?
*ui->gridLayout->setContentsMargins(QMargins(10,60,0,0)); ui->gridLayout->setVerticalSpacing(10);*
具體size,自行可以調(diào)整到比較合適的位置。
源碼實(shí)現(xiàn):
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();//可以進(jìn)行提供一個(gè)背景圖片 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,"錯(cuò)誤提示","密碼錯(cuò)誤"); ? ? ? ? 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> //增加對(duì)按鈕類(lèi)型的設(shè)定 //按鈕控件中缺少 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(); ? } ? //添加圖標(biāo) ? 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(); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
dev-c++創(chuàng)建lib(靜態(tài)鏈接庫(kù))文件的實(shí)現(xiàn)步驟
本文主要介紹了dev-c++創(chuàng)建lib(靜態(tài)鏈接庫(kù))文件的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C++中結(jié)構(gòu)體和Json字符串互轉(zhuǎn)的問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于C++中結(jié)構(gòu)體和Json字符串互轉(zhuǎn)問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C++LeetCode數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode數(shù)據(jù)結(jié)構(gòu),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C++分析類(lèi)的對(duì)象作類(lèi)成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
終于到了對(duì)象的初始化和清理的最后階段了,在這里分享一個(gè)cpp里有多個(gè)類(lèi)時(shí),一個(gè)類(lèi)的對(duì)象作為另一個(gè)類(lèi)成員的時(shí)候構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用的時(shí)機(jī)。還有一個(gè)靜態(tài)成員也是經(jīng)??嫉降狞c(diǎn),在這篇博客將會(huì)詳解其概念并舉出案例鞏固,讓我們開(kāi)始2022-05-05C++實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07C/C++自主分配出現(xiàn)double free or corruption問(wèn)題解決
這篇文章主要為大家介紹了C/C++出現(xiàn)double free or corruption問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04opencv車(chē)道線檢測(cè)的實(shí)現(xiàn)方法
這篇文章主要介紹了opencv車(chē)道線檢測(cè)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08