pyqt4 QTextEdit - 如何设置MaxLength?

问题描述 投票:0回答:3

我有一个与数据库 VARCHAR(2048) 字段绑定的多行 QTextEdit。

我想将用户输入长度限制为最多 2048 个字符

QTextEdit 没有像 QLineEdit 那样的 setMaxLength(int) 方法。

大家有什么建议吗?

self.editBox = QTextEdit()

谢谢

python pyqt pyqt4
3个回答
3
投票

我在 Qt Wiki 上找到了这个常见问题解答

没有直接的 API 来设置/获取 QTextEdit 的最大长度,但您可以通过将插槽连接到 contentsChanged() 信号来自行处理,然后调用 toPlainText().length() 来找出答案它有多大。如果达到限制,那么您可以重新实现 keyPressEvent()keyReleaseEvent() 对普通字符不执行任何操作。

您可能也对这篇文章感兴趣,其中附加了一些代码(希望它对您有用):

#include <QtCore>
#include <QtGui>
#include "TextEdit.hpp"

TextEdit::TextEdit() : QPlainTextEdit() {
connect(this, SIGNAL(textChanged()), this, SLOT(myTextChanged()));
}

TextEdit::TextEdit(int maxChar) : QPlainTextEdit() {
this->maxChar = maxChar;
connect(this, SIGNAL(textChanged()), this, SLOT(myTextChanged()));
}

int TextEdit::getMaxChar() {
return maxChar;
}

void TextEdit::setMaxChar(int maxChar) {
this->maxChar = maxChar;
}

void TextEdit::myTextChanged() {
if (QPlainTextEdit::toPlainText().length()>maxChar) {
QPlainTextEdit::setPlainText(QPlainTextEdit::toPlainText().left(QPlainTextEdit::toPlainText().length()-1));
QPlainTextEdit::moveCursor(QTextCursor::End);
QMessageBox::information(NULL, QString::fromUtf8("Warning"),
QString::fromUtf8("Warning: no more then ") + QString::number(maxChar) + QString::fromUtf8(" characters in this field"),
QString::fromUtf8("Ok"));
}
}

1
投票

使用槽“textChanged()”:

txtInput = QPlainTextEdit()

QObject.connect(txtInput, SIGNAL("textChanged()"), txtInputChanged)

def txtInputChanged():
    if txtInput.toPlainText().length() > maxInputLen:
        text = txtInput.toPlainText()
        text = text[:maxInputLen]
        txtInput.setPlainText(text)

        cursor = txtInput.textCursor()
    cursor.setPosition(maxInputLen)
    txtInput.setTextCursor(cursor)

另一种可能性是从“QPlainTextEdit”派生并在达到最大长度或按下不需要输入的其他键时重新实现“keyPress”事件过滤键。

http://doc.qt.io/qt-5/qplaintextedit.html#keyPressEvent


0
投票

感谢nvd,将光标位置保持在正确的位置:

self.description = QTextEdit()
self.description.textChanged.connect(partial(self.txtInputChanged, self.description, 200))
def txtInputChanged(self, txtInput, maxInputLen):
    text = txtInput.toPlainText()
    if len(text) > maxInputLen:
        cursor = txtInput.textCursor()
        pos = cursor.columnNumber()
        text = text[:pos-1] + text[pos:]
        txtInput.setPlainText(text)
        cursor.setPosition(pos - 1)
        txtInput.setTextCursor(cursor)
© www.soinside.com 2019 - 2024. All rights reserved.