啰嗦
在设置 QLineEdit 默认提示语和最大可输入长多时,可以很方便的调用自带的 setPlaceholderText() 和 setMaxLength ()函数来实现,可是在用到多行文本输入的地方要用到QTextEdit ,但是 QTextEdit 并未自带这个两个函数,那么要实现这个功能只能自己另外写了。
实现
实现起来也很简单,主要是处理 focusInEvent 和 focusOutEvent 俩个事件,另外需要设置默认占位符的颜色为灰色,由于QTextEdit 支持 html ,可以很方便的使用 setHtml 来实现。
private:
int maxLength;//最大输入长度
QString placeholderText;
void setPlaceholderText(QString text){
placeholderText=text;
if(toPlainText().isEmpty())//font-family:'微软雅黑'; color:#7f7f7f;">输入内容不超过200字
setHtml(QString("<font color=\"#7f7f7f\">%1</font>").arg(placeholderText));
}
protected:
void focusInEvent(QFocusEvent *e){
if (!placeholderText.isNull()){
QString t=toPlainText();
if (t.isEmpty() || t==placeholderText) clear();
}
QTextEdit::focusInEvent(e);
}
void focusOutEvent(QFocusEvent *e){
if (Qt::PopupFocusReason == e->reason())
{
// 修复右键无焦点时预输入占位符不消失 [2019-6-13 By Pafey]
return;
}
if (!placeholderText.isNull()){
if (toPlainText().isEmpty())
setHtml(QString("<font color=\"#7f7f7f\">%1</font>").arg(placeholderText));
}
效果如下:
而限制输入最大长度,在子类中设置成员变量保存最大长度值,以及在父类中响应信号 textChanged()
//父类响应槽函数,将文本限制在设置的最大长度之内
void parentWidget::solt_textEditChanged()
{
if (NULL != pTextEdit)
{
QString textContent = pTextEdit->toPlainText();
int length = textContent.count();
int maxLength = pTextEdit->getMaxLength(); // 最大字符数
if(length > maxLength) {
int position = pTextEdit->textCursor().position();
QTextCursor textCursor = pTextEdit->textCursor();
textContent.remove(position-(length-maxLength), length-maxLength);
pTextEdit->setText(textContent);
textCursor.setPosition(position-(length-maxLength));
pTextEdit->setTextCursor(textCursor);
}
}
}
//调用
if (0 == pTextEdit){
pTextEdit = new QMyTextEdit(this);
}
pTextEdit->setMaxLength(300);//要在connect 之前设置
connect( pTextEdit ,SIGNAL( textChanged() ), this, SLOT( solt_textEditChanged() ) );
下载
类源码:0分下载