1. 程式人生 > >【Qt】Qt之密碼框不可選中、複製、貼上、無右鍵選單等【轉】

【Qt】Qt之密碼框不可選中、複製、貼上、無右鍵選單等【轉】

簡述

在做使用者登入、修改密碼的時候,往往會用到密碼框,其中一些功能要求與普通的輸入框不同,例如:不能選中、複製、貼上、無右鍵選單等功能,當然設定密碼不可見是必須的!

下面介紹兩種方式來實現相同的效果。

效果

這裡寫圖片描述

基礎部分

//設定無右鍵選單
setContextMenuPolicy(Qt::NoContextMenu);

//設定無輸入時提示資訊
setPlaceholderText(QStringLiteral("請輸入密碼"));

//設定密碼效果模式
setEchoMode(QLineEdit::Password); //設定最大輸入長度16位 setMaxLength(16);

enum QLineEdit::EchoMode

這個列舉值描述輸入框如何顯示內容。

常數描述
QLineEdit::Normal 0 輸入時,正常顯示字元,預設值
QLineEdit::NoEcho 1 不顯示任何資訊,密碼長度、資訊需要保密時比較適用
QLineEdit::Password 2 顯示平臺相關的密碼掩碼字元,而非實際的字元輸入
QLineEdit::PasswordEchoOnEdit 3 編輯時候顯示字元,編輯結束後和QLineEdit::Password效果一樣

事件過濾器

介面說明

首先看下介面說明:

void QObject::installEventFilter(QObject * filterObj)

為物件安裝一個filterObj事件過濾器,例如:

monitoredObj->installEventFilter(filterObj);

事件過濾器物件接受傳送到被觀察者物件的所有事件,可以停止事件或將其轉發到被觀察者物件。事件過濾器物件通過eventFilter() 來接受事件,如果指定的事件被過濾則必須返回true,否則返回false。

如果一個物件安裝多個事件過濾器,那麼,最後安裝的過濾器首先被啟用。

警告:如果在eventFilter()函式中刪除接收物件,一定要返回true。如果返回false,Qt給已刪除的物件傳送事件,程式會crash。

注意,過濾器物件必須和被觀察者物件處於同一執行緒。如果過濾器物件在不同的執行緒,這個函式什麼都不做。如果在呼叫這個函式之後,過濾器物件或被觀察者物件被移動到不同的執行緒,事件過濾器將不會被呼叫,直到兩個物件再處於相同的執行緒中。

實現方式

首先,需要判斷被觀察的物件,也就是這裡的obj,我們觀察的是密碼框QLineEdit,所以先進行轉換。

然後進行事件判斷與轉換:滑鼠移動對應的事件型別為mouseMoveEvent,滑鼠雙擊對應的事件型別為mouseDoubleClickEvent,全選、複製、貼上對應的事件型別為keyPressEvent,當接收到這些事件時,需要被過濾掉,所以返回true。

注意:return QObject::eventFilter(obj, event)這句程式碼很關鍵,這裡的意思是繼續傳遞該事件到被觀察者,由其本身呼叫相應的事件。

bool EventFilter::eventFilter(QObject *obj, QEvent *event)
{
    QLineEdit *pLineEdit = qobject_cast<QLineEdit *>(obj);
    if (pLineEdit != NULL)
    {
        switch (event->type())
        {
        case QEvent::MouseMove:  //滑鼠移動事件
        case QEvent::MouseButtonDblClick:  //滑鼠雙擊事件
            return true;
        case QEvent::KeyPress:  //鍵盤事件
        {
            QKeyEvent *pKeyEvent = static_cast<QKeyEvent*>(event);
            if(pKeyEvent->matches(QKeySequence::SelectAll)
                    || pKeyEvent->matches(QKeySequence::Copy)
                    || pKeyEvent->matches(QKeySequence::Paste))
            {
                return true;
            }
        }
        }
    }
    return QObject::eventFilter(obj, event);
}

事件重寫

這種方式可能是大多數人都能想到的,針對輸入框重新實現(PasswordLineEdit繼承於QLineEdit)。

如上,我們分析得出滑鼠移動對應的事件型別為mouseMoveEvent,滑鼠雙擊對應的事件型別為mouseDoubleClickEvent,全選、複製、貼上對應的事件型別為keyPressEvent,那麼我們重寫相應的事件即可。

//遮蔽輸入框全選、複製、貼上功能
void PasswordLineEdit::keyPressEvent(QKeyEvent *event)
{
    if(event->matches(QKeySequence::SelectAll)
            || event->matches(QKeySequence::Copy)
            || event->matches(QKeySequence::Paste))
    {
        return;
    }

    QLineEdit::keyPressEvent(event);
}

//滑鼠位於密碼框中時不可移動
void PasswordLineEdit::mouseMoveEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
}

//滑鼠雙擊密碼框時不可選中
void PasswordLineEdit::mouseDoubleClickEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
}

原始碼下載

相關推薦

QtQt密碼不可選中複製貼上選單

簡述 在做使用者登入、修改密碼的時候,往往會用到密碼框,其中一些功能要求與普通的輸入框不同,例如:不能選中、複製、貼上、無右鍵選單等功能,當然設定密碼不可見是必須的! 下面介紹兩種方式來實現相同的效果。 簡述 效果 基礎部分 事件過濾器 介面說明 實現方式 事件重

QtQt國際化(系統文字-QMessageBox按鈕QLineEdit選單)

簡介 使用Qt的時候,經常會遇到英文問題,例如:QMessageBox中的按鈕、QLineEdit、QSpinBox、QScrollBar中的右鍵選單等。通常情況下,我們軟體都不會是純英文的,那麼如何處理這些問題呢?其實這也屬於國際化的一部分。 下面,以中英文切換為例來為大家分享,其它語言切換

[Tricks] 為資料夾選單增加 使用VS Code 開啟

傳統的IDE安裝之後都會在資料夾的右鍵選單中增加如【Open in Visual Studio】或者【Open Folder as IntelliJ IDEA Project】這樣的選項 但VS Code作為一個輕量級的Editor安裝完畢之後並沒有這個選單,這裡手動通過修改登錄檔來增加這個選單 使用cmd開

Qt選單工具欄狀態列選單的實現

在QMainWidget基礎上實現選單欄、工具欄、狀態列、右鍵選單。 標頭檔案: #ifndef GWDEMO_H #define GWDEMO_H #include <QMainWindow> #include <QMenu> #include <Q

Layui關於單選選中狀態,下拉預設顯示

author:咔咔 wechat:fangkangfk   案例:    我們先看一下點選修改電影這個分類的資料   在修改的這個頁面裡邊,分類也是迴圈出來的   只需要讓查出的來的id跟這個迴圈的

Qt選單

1、右鍵選單建立和顯示作為一種互動性強、使用方便的右鍵選單在程式中是非常常用的,在Qt中可以輕鬆的實現。QMenu menu; //新增選單項,指定圖示、名稱、響應函式 menu.addAction(QIcon("1.png"), QStringLiteral("新增"),this,SLOT(OnBscGr

asp.net記住密碼功能密碼不能賦值

一、設定密碼框 在asp.NET中密碼框並不神奇,只是將普通TextBox的TextMode屬性值修改為Password即可; 二、防止頁面重新整理清空密碼框 TextBox一旦被修改為密碼框,其填充的值會隨著頁面的重新整理而被清空,處理方法如下: 在頁面後臺,P

原創MAC利用AUTOMATOR製作選單獲取MARKDOWN圖片外鏈

PicUploader 是一個用php編寫的藉助Mac的『自動操作/Automator』來幫助你快速上傳你的圖片到七牛雲/騰訊雲/網易雲/百度雲/阿里雲/京東雲/sm.ms並自動把地址拼接成markdown格式放到剪貼簿的小工具(故只有MacOS使用者能

Qt QListWidget QTreeWidget QComboBox控制元件中,禁用滾動條的選單

有時候在開發新控制元件的時候,會偶然點到滾動條的右鍵選單,出現之後很難看 那麼怎麼去掉呢? 其實很簡單,如果是QListWidget ,QTreeWidget控制元件, //記得包含標頭檔案 #i

ZedGraph選單和滑鼠滾軸的移動縮放功能的啟用和禁用

本文是個人對使用過的【ZedGraph】基本功能的小結,現在逐步完善中... 通過【ZedGraph】控制元件屬性修改: 1.禁用右鍵選單: IsShowContextMenu = false; 2.禁用滑鼠滾軸移動: IsEnableHPan = false; //禁止橫

ZedGraph刪除或重新命名(漢化)選單

本文結合網路資源,結合自身實踐進行了部分整理和改動,現逐步完善中,內容僅供參考。 網路資源部分轉載自:http://blog.sina.com.cn/main_v5/ria/private.html?uid=1806259402 在zedgraph生成的圖表中,右鍵選單會出

PyQt 選單的實現(Qt.CustomContextMenu方式)

從Qt文件Qt::ContextMenuPolicy的值可以看出,實現右鍵選單的方式有三種,這對於所有繼承於QWidget的類都是通用的,在用每一種方式實現之前都要呼叫QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy)方

javascript自定義選單並遮蔽預設選單原創

原理很簡單,就是右擊滑鼠(oncontextmenu事件)return false阻止預設右鍵選單,之後顯示自定義的右鍵選單,選單顯示位置由事件源的clientX和clientY計算得出。 [html] view plain copy  print?

Qt選單的新增

滑鼠事件是學習Qt必不可少的一個事件,初學者總是會忽略這一點,而右鍵選單在平常的使用中更是常見,下面就Qt中新增右鍵選單的幾種方法做一簡單的介紹: 1、滑鼠事件新增 /**重寫滑鼠處理器*/ void QWidget::mousePressEvent(QMo

Unity編輯器使用反射和Attribute實現自定義選單

unity提供了許多Attribute,比如[MenuItem]和[ContextMenu],一個是在編輯器選單欄中新增選單按鈕,一個是在檢視面板新增上下文選單,由於其原理是基於C#的Attribute功能,我們自然可以想到,是否可以自己編寫一套自定義Attribute,來

JQuery選單外掛——contextmenu

右鍵選單外掛可以繫結頁面中的任意元素,繫結後,選中元素,點選右鍵,便通過該外掛彈出一個快捷選單,點選選單各項名稱執行相應操作,呼叫程式碼如下: $(selector).contextMenu(menu

Dev DevExpresstreelist選單實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JS學習筆記 - 自定義選單文字只能輸入數字

  <script> // 事件總共有2個部分, //1.點選滑鼠右鍵的表現 oncontextmenu 2.點選滑鼠左鍵的表現(即普通點選onclick) // 點選右鍵,div位置定位到滑鼠所在位置, 且阻止滑鼠右鍵的預設選單 // 點選左

OpenLayers 3 新增地圖滑鼠選單

      新增右鍵選單,首先我們要監聽滑鼠右鍵點選的操作,我們知道滑鼠右鍵事件名是 contextmenu,當滑鼠在 html 元素之上,點選滑鼠右鍵,便會觸發 contextmenu 事件,在 contextmenu 事件的回撥函式中實現相應的顯示選單功能即

AE學習筆記選單的新增與實現

        ArcGIS Engine 中自定義了一些新增命令、工具和選單的基類,在需要寫相應函式的時候可以直接很方便的新增。 我在前面的文章裡面有一節講述過如何新增控制元件命令:http://blog.csdn.net/my_lord_/article/detail