今天鼓捣了半天,终于实现了自定义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