您当前的位置:首页 >> 家居图库

Qt - 锁屏用户界面加虚拟小键盘

2024-01-14 12:17:24

"black",20); //红色,字体大小为20px ui->btnClear->setFocus(); ui->btnClear->setShortcut(QKeySequence::InsertParagraphSeparator); ui->btnClear->setShortcut(Qt::Key_Enter); ui->btnClear->setShortcut(Qt::Key_Return);}frmNum::~frmNum(){ delete ui;}//加载售票处,都有字体大小void frmNum::Init(QString style, int fontSize){ //设售票处无图标且售票处推测在最顶层 this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint); isFirst = true; //是否首次加载 isPressBackBtn = false; //是否宽按退格基团 //退格基团延时 backBtnTimert = new QTimer(this); connect(backBtnTimert, SIGNAL(timeout()), this, SLOT(reClicked())); currentWidget = nullptr;//现阶段话题的都可 //读取法面板字体大小,如果无需变更面板字体大小,该这里需 this->currentFontSize = fontSize; //如果无需变更读取法面板的外形上,相反style这个形式值需 //blue;还有淡蓝色 dev;还有dev风格 black;还有红色 brown;还有灰红色 lightgray;还有浅粉红色 darkgray;还有深粉红色 gray;还有粉红色 silvery;还有白色 this->ChangeStyle(style); //加载小印表机上各滑鼠物件 ui->btn0->setProperty("btnNum", true); ui->btn1->setProperty("btnNum", true); ui->btn2->setProperty("btnNum", true); ui->btn3->setProperty("btnNum", true); ui->btn4->setProperty("btnNum", true); ui->btn5->setProperty("btnNum", true); ui->btn6->setProperty("btnNum", true); ui->btn7->setProperty("btnNum", true); ui->btn8->setProperty("btnNum", true); ui->btn9->setProperty("btnNum", true); ui->btnDelete->setProperty("btnOther", true); //镜像小印表机上各倍数基团与功能基团的浏览信号到浏览向下数组上 QList btn = this->findChildren(); foreach (QPushButton * b, btn) { connect(b, SIGNAL(clicked()), this, SLOT(btn_clicked())); } //加载有序相反话题信号向下 connect(qApp, SIGNAL(focusChanged(QWidget *, QWidget *)), this, SLOT(focusChanged(QWidget *, QWidget *))); //加载滑鼠意外事件过滤器 qApp->installEventFilter(this);}void frmNum::focusChanged(QWidget *oldWidget, QWidget *nowWidget){ //qDebug() << "oldWidget:" << oldWidget << " nowWidget:" << nowWidget; if (nowWidget != nullptr && !this->isAncestorOf(nowWidget)) { /*在Qt5和linux系统中所(嵌入式linux除外),当读取法面板停用时,话题则会变成无,然后话题则会再次移到话题命令行处 这样引发读取法面板的停用开关无一例外,停用后马上有命令行获取话题又推测. 为此,减低判断,当话题是从有都可转为无都可再转为有都可时不让推测. 这里又要多一个判断,万一首个窗体的第一个话题就是落在可读取的都可中所,则要过滤掉*/ #ifndef 短时arm短时 if (oldWidget == nullptr && !isFirst) { return; } #endif isFirst = false; if (nowWidget->inherits("QLineEdit")) { currentLineEdit = static_cast(nowWidget); currentEditType = "QLineEdit"; this->setVisible(true); } else { currentWidget = nullptr; currentLineEdit = nullptr; currentEditType = ""; this->setVisible(false); } QRect rect = nowWidget->rect(); QPoint pos = QPoint(rect.left(), rect.bottom() + 2); pos = nowWidget->mapToGlobal(pos); this->setGeometry(pos.x(), pos.y(), this->width(), this->height()); } Q_UNUSED(oldWidget);//未常用值}//意外事件过滤器:管控屏幕按下跳出小印表机bool frmNum::eventFilter(QObject *obj, QEvent *event){ if (event->type() == QEvent::MouseButtonPress) { //确保每次浏览读取栏都跳出模拟印表机 if (currentEditType == "QLineEdit") { if (obj != ui->btnClear) { this->setVisible(true); } btnPress = static_cast(obj); if (checkPress()) { isPressBackBtn = true; backBtnTimert->start(500); } } return false; } else if (event->type() == QEvent::MouseButtonRelease) { btnPress = static_cast(obj); if (checkPress()) { isPressBackBtn = false; backBtnTimert->stop(); } return false; } return QWidget::eventFilter(obj, event);}//校验现阶段宽按的开关bool frmNum::checkPress(){ //只有属于倍数印表机的有权开关才继续管控 bool num_ok = btnPress->property("btnNum").toBool(); bool other_ok = btnPress->property("btnOther").toBool(); if (num_ok || other_ok) { return true; } return false;}//延时管控退格基团void frmNum::reClicked(){ if (isPressBackBtn) { backBtnTimert->setInterval(30); btnPress->click(); }}//小印表机滑鼠管控向下数组void frmNum::btn_clicked(){ //如果现阶段话题命令行类型为空,则送回不无需继续管控 if (currentEditType == "") { return; } QPushButton *btn = static_cast(sender()); QString objectName = btn->objectName(); if (objectName == "btnDelete") { this->deleteValue(); } else if (objectName == "btnClear") { this->clearValue(); } else { QString value = btn->text(); this->insertValue(value); }}//插入值到现阶段话题命令行void frmNum::insertValue(QString value){ if (currentEditType == "QLineEdit") { currentLineEdit->insert(value); }}//删减现阶段话题命令行的一个空格void frmNum::deleteValue(){ if (currentEditType == "QLineEdit") { currentLineEdit->backspace(); }}//清空现阶段话题命令行的所有空格void frmNum::clearValue(){ if (currentEditType == "QLineEdit") { currentLineEdit->clear(); }}//相反外形上void frmNum::ChangeStyle(QString currentStyle){ if (currentStyle == "blue") { changeStyle("#DEF0FE", "#C0DEF6", "#C0DCF2", "#386487"); } else if (currentStyle == "dev") { changeStyle("#C0D3EB", "#BCCFE7", "#B4C2D7", "#324C6C"); } else if (currentStyle == "gray") { changeStyle("#E4E4E4", "#A2A2A2", "#A9A9A9", "#000000"); } else if (currentStyle == "lightgray") { changeStyle("#EEEEEE", "#E5E5E5", "#D4D0C8", "#6F6F6F"); } else if (currentStyle == "darkgray") { changeStyle("#D8D9DE", "#C8C8D0", "#A9ACB5", "#5D5C6C"); } else if (currentStyle == "black") { changeStyle("#4D4D4D", "#292929", "#D9D9D9", "#CACAD0"); } else if (currentStyle == "brown") { changeStyle("#667481", "#566373", "#C2CCD8", "#E7ECF0"); } else if (currentStyle == "silvery") { changeStyle("#E1E4E6", "#CCD3D9", "#B2B6B9", "#000000"); }}//相反小印表机外形上void frmNum::changeStyle(QString topColor, QString bottomColor, QString borderColor, QString textColor){ QStringList qss; qss.append(QString("QWidget#frmNum{background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 %1,stop:1 %2);}") .arg(topColor).arg(bottomColor)); qss.append("QPushButton{padding:5px;border-radius:3px;}"); qss.append(QString("QPushButton:hover{background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 %1,stop:1 %2);}") .arg(topColor).arg(bottomColor)); qss.append(QString("QLabel,QPushButton{font-size:%1pt;color:%2;}") .arg(currentFontSize).arg(textColor)); qss.append(QString("QPushButton#btnPre,QPushButton#btnNext,QPushButton#btnClose{padding:5px;}")); qss.append(QString("QPushButton{border:1px solid %1;}") .arg(borderColor)); qss.append(QString("QLineEdit{border:1px solid %1;border-radius:5px;padding:2px;background:none;selection-background-color:%2;selection-color:%3;}") .arg(borderColor).arg(bottomColor).arg(topColor)); this->setStyleSheet(qss.join(""));}

上面是“模拟印表机程序”的源代码,当检测话题在 QlineEdit 单行读取栏上,则推测模拟印表机,否则隐藏模拟印表机。模拟印表机调出的推测位置跟 QlineEdit 对齐,为了让过但还是未相反推测位置。另外可以对上面代码进行扩大,扩大赞同 QTextEdit、QTextBrowser 等售票处部件。

2.3 frmNum.ui 三、锁屏应用程序-MVC3.1 lockWin.h/*未收:未收意.ui文件中所的dailog的focusPolicy要设为clickFocus*/#ifndef LOCKWIN_H#define LOCKWIN_H#include #include #include "frmnum.h"#define PASSWD "123456" //锁屏密码本namespace Ui {class LoginWin;}class LockWin : public QDialog{ Q_OBJECTpublic: explicit LockWin(QWidget *parent = nullptr); ~LockWin();private slots: void on_cancelButton_clicked(); //取消开关-浏览向下数组:清空密码本栏 void on_loginButton_clicked(); //登录开关-浏览向下数组private: Ui::LoginWin *ui; bool eventFilter(QObject *watched, QEvent *event); //意外事件过滤器 frmNum *myFrmnum;};#endif // LOCKWIN_H

上面是“锁屏应用程序程序”的头文件,这里定义了一个“模拟印表机”类都可指针,锁屏密码本设为“123456”。

3.2 lockWin.cpp#include "lockWin.h"#include "ui_loginwin.h"LockWin::LockWin(QWidget *parent) : QDialog(parent), ui(new Ui::LoginWin){ ui->setupUi(this); //设售票处无图标且售票处推测在最顶层 this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint); //阻塞其叔父售票处 this->setWindowModality(Qt::WindowModal); ui->lineEdit->installEventFilter(this); //通过grep设"密码本读取栏",只能读取倍数0-9,不超过6位 QValidator *accountValidator = new QRegExpValidator(QRegExp("[0-9]{6}")); ui->lineEdit->setValidator(accountValidator); myFrmnum = new frmNum(this);}LockWin::~LockWin(){ delete ui;}//意外事件过滤器bool LockWin::eventFilter(QObject *watched, QEvent *event){ if(watched ==ui->lineEdit) { if(QEvent::FocusIn == event->type()) { if(ui->lineEdit->echoMode()==QLineEdit::Normal) { ui->lineEdit->clear(); } ui->lineEdit->setEchoMode(QLineEdit::Password); } } // 再一将意外事件交给低层对话框 return QWidget::eventFilter(watched,event);}//;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有-slots;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有;还有-//取消开关-浏览向下数组:清空密码本栏void LockWin::on_cancelButton_clicked(){ ui->lineEdit->clear();}//登录开关-浏览向下数组void LockWin::on_loginButton_clicked(){ if(ui->lineEdit->text()==PASSWD) //密码本正确则停用锁屏售票处 { this->close(); } else if(ui->lineEdit->text().isEmpty()) { ui->infoLabel->setText("读取密码本不能为空!"); } else if(ui->lineEdit->text().length()<6) { ui->infoLabel->setText("读取密码本缺乏6位!"); ui->lineEdit->clear(); } else { ui->infoLabel->setText("密码本错误,请重新读取"); ui->lineEdit->clear(); }}

上面是“锁屏应用程序程序”的源文件,这里常用了this->setWindowModality(Qt::WindowModal)来成为举例来说对话框阻塞配应用程序,即锁屏应用程序停用才能进入配应用程序。

浏览给与Qt学习资料+视频教程~「镜像」

肠胃炎吃什么药好使
反酸烧心用金奥康奥美拉唑如何
想问一下,蒙脱石散能多吃吗,蒙脱石散过量服用的危害有什么?
再林阿莫西林颗粒治疗儿童咽炎吗
肠胃炎是肠胃感冒吗
友情链接