目的
主要是说明这三个小部件的使用, 以及一些关联, 并无什么特别深奥的知识点。当然洛,QSpinBox与QDoubleSpinBox, QTextEdit与QPlainTextEdit大同小异, 就顺便替代说了。
QLineEdit, QSpinBox, QTextEdit这三个小部件在Qt Designer 统一为Input Widgets, 说明它们共同点就是可输入的编辑框, 但是QLineEdit应用于那种行编辑器, 用在账号,密码等编辑输入。 QSpinBox用于integers数据可旋转反复编辑(输入数据类型可带前后缀suffix输入, ¥%等等)。QTextEdit可用于编辑显示富文本, 使得该功能支持编辑html。
QLineEdit
QLineEdit 小部件是一个单行文本编辑器
行编辑允许用户使用一系列有用的编辑功能来输入和编辑单行纯文本,包括撤消和重做、剪切和粘贴以及拖放. 我常用与用户账号, 密码等单行文本输入的编辑功能, 它支持输入掩码, 验证器, 支持输入最大文本数–(QTextEdit 没有相应接口只能自己控制), 密码明文等。
m_pSearchLineEdit = new QLineEdit();
QPushButton *pSearchButton = new QPushButton(this);
pSearchButton->setCursor(Qt::PointingHandCursor);
pSearchButton->setFixedSize(22, 22);
pSearchButton->setToolTip(QStringLiteral("搜索"));
pSearchButton->setStyleSheet("QPushButton{border-image:url(:/images/icon_search_normal); background:transparent;} \
QPushButton:hover{border-image:url(:/images/icon_search_hover)} \
QPushButton:pressed{border-image:url(:/images/icon_search_press)}");
//防止文本框输入内容位于按钮之下
QMargins margins = m_pSearchLineEdit->textMargins();
m_pSearchLineEdit->setTextMargins(margins.left(), margins.top(), pSearchButton->width(), margins.bottom());
m_pSearchLineEdit->setPlaceholderText(QStringLiteral("请输入搜索内容"));
QHBoxLayout *pSearchLayout = new QHBoxLayout();
pSearchLayout->addStretch();
pSearchLayout->addWidget(pSearchButton);
pSearchLayout->setSpacing(0);
pSearchLayout->setContentsMargins(0, 0, 0, 0);
m_pSearchLineEdit->setLayout(pSearchLayout);
connect(pSearchButton, SIGNAL(clicked(bool)), this, SLOT(search()));
QSpinBox
QSpinBox 类提供了一个旋转框小部件。
QSpinBox 旨在处理整数和离散值集(例如,月份名称); 将 QDoubleSpinBox 用于浮点值。
可以通过lineEdit() 访问编辑框, QTextEdit可没有。用户可通过上下按钮调整数值,支持prefix() and suffix(), 通过validate(), textFromValue() and valueFromText()验证输入的字符, 并将其转化为我们要显示的格式内容。可以设置setRange()限制输入范围, 有一个注意点就是setValue是设置integers, 而不是字符串型。
QTextEdit
QTextEdit用于编辑显示富文本小部件。
能够以html-style格式引入去支持富文本的编辑。可支持表格, 图片的显示。它不能通过输入控制文本数, 需要自己编辑实现。
connect(this, &TextEdit::textChanged, this, &TextEdit::onTextChanged);
void TextEdit::onTextChanged()
{
QString textContent = toPlainText();
int length = textContent.count();
if(length > m_maxLength)
{
int position = textCursor().position();
QTextCursor textCursor = this->textCursor();
int move = length - m_maxLength;
textContent.remove(position - move, length - move);
setText(textContent);
textCursor.setPosition(position - move);
setTextCursor(textCursor);
}
}
它继承自QAbstractScrollArea, 因此可调用相关滑动区域窗口设置,
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
同时也注意viewport 相关设置调用。
insertFromMimeData 可以将源指定的 MIME 数据对象的内容插入到当前光标位置的文本编辑中。 每当作为剪贴板粘贴操作的结果插入文本时,或者当文本编辑接受来自拖放操作的数据时,都会调用它。
我们重新实现此功能以启用对其他 MIME 类型的拖放支持, 或者过滤一些数据。
bool TextEdit::canInsertFromMimeData(const QMimeData *source) const
{
if(source->hasImage()){
return false;
}
return QTextEdit::canInsertFromMimeData(source);
}
//avoid styled text and image
void TextEdit::insertFromMimeData(const QMimeData *source)
{
QTextCursor cursor = this->textCursor();
if (source->hasImage()){
cursor.insertText("");
return;
}else if(source->hasText()){
cursor.insertText(source->text());
return;
}
QTextEdit::insertFromMimeData(source);
}