QLineEdit 仿QQ簽名框(思路很獨特:用QSS::hover顯示額外的圖片)


今天鼓搗了半天,終於實現了自定義Qt中的QlineEdit控件的大致效果。

這個問題對於新手而言,主要有以下幾個難點:

1.繼承QLineEdit控件

2.QSS設置QLineEdit的相關樣式,可以省下很多代碼

3.自定義相關事件

void mousePressEvent(QMouseEvent *event);  // 鼠標點擊的時候,編程輸入框
void keyPressEvent(QKeyEvent *event);   // 按下Enter的時候,處理
void mouseMoveEvent(QMouseEvent *event); // 鼠標移動的時候,顯示效果

OK,下面我們來一步步實現這個自定義控件。

首先,第一步你肯定是要創建一個新類繼承QLineEdit, QtCreator會自動為你實現一些無關緊要的代碼。

第二步用PhotoShop做一個突出的高亮圖片,像QQ簽名框上的那樣:

第三步開始實現具體的代碼了。

首先構造函數中需要設置一些QSS樣式,這一步可以省下很多代碼,具體樣式對應的功能,請讀者自行研究。

this->setStyleSheet("QLineEdit{ background:rgba(0,0,0,0%); border:1px; font:10pt}"
                    "QLineEdit:hover{ border-image:url(:/btn_background.png); }"
                    "QLineEdit:!hover{background:rgba(0,0,0,0%);}"
                    "QLineEdit:focus {background:white;border-image:none; border:1px groove lightgray; border-radius:2px}");

實現三個繼承的事件函數:

復制代碼
void QSLineEdit::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Enter - 1)
        this->clearFocus();

    QLineEdit::keyPressEvent(event);
}

void QSLineEdit::mousePressEvent(QMouseEvent *event)
{
    this->setFocus();
    this->setCursor(QCursor(Qt::IBeamCursor));
    QLineEdit::mousePressEvent(event);
}

void QSLineEdit::mouseMoveEvent(QMouseEvent *event)
{
    if(this->hasFocus())
        this->setCursor(QCursor(Qt::IBeamCursor));
    else
        this->setCursor(QCursor(Qt::ArrowCursor));
    QLineEdit::mouseMoveEvent(event);
}
復制代碼

到這一步基本上實現全部效果了,但是有一個問題需要注意:當點擊窗體其他地方的時候,這個自定義控件不會失去焦點,即時你繼承focusOutEvent也不會;沒辦法,所以在窗體中多實現了一個事件mousePressedEvent

void Dialog::mousePressEvent(QMouseEvent *e)
{
    leEdit->clearFocus();
    QDialog::mousePressEvent(e);
}

至此OK,看起來很簡單的問題,卻想了我半天時間。源代碼在:WidgetEdit.rar

 轉載請注明出處:http://www.cnblogs.com/xufeiyang/p/3310670.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM