ZetCode

PyQt QLineEdit

最后修改于 2023 年 8 月 24 日

在本文中,我们将展示如何在 PyQt 中使用工具提示。

访问 Advanced PyQt5 电子书,阅读 PyQt6 教程,或列出所有 PyQt 教程

QLineEdit

QLineEdit 允许用户输入和编辑单行纯文本。它具有一系列有用的编辑功能,包括撤销和重做、剪切和粘贴以及拖放。

当文本改变时,会发出 textChanged 信号;

PyQt QLineEdit textChanged

下面是一个使用 QLineEdit 的简单示例。

text_changed.py
#!/usr/bin/python

import sys

from PyQt6.QtWidgets import (QApplication, QLabel, QLineEdit,
                             QVBoxLayout, QWidget)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        hbox = QVBoxLayout(self)
        
        self.lbl = QLabel(self)
        qle = QLineEdit(self)

        qle.textChanged[str].connect(self.onChanged)

        hbox.addWidget(self.lbl)
        hbox.addSpacing(20)
        hbox.addWidget(qle)

        self.setGeometry(400, 400, 350, 300)
        self.setWindowTitle('QLineEdit')
        self.show()

    def onChanged(self, text):

        self.lbl.setText(text)
        self.lbl.adjustSize()


def main():
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

这个示例展示了一个行编辑部件和一个标签。我们在行编辑器中输入的文本会立即显示在标签部件中。

qle = QLineEdit(self)

创建 QLineEdit 部件。

qle.textChanged[str].connect(self.onChanged)

如果行编辑部件中的文本发生变化,我们调用 onChanged 方法。

def onChanged(self, text):
    
    self.lbl.setText(text)
    self.lbl.adjustSize() 

onChanged 方法内部,我们将输入的文本设置到标签部件。我们调用 adjustSize 方法来根据文本的长度调整标签的大小。

QLineEdit 对齐文本

部件的文本可以使用 setAlignment进行对齐。

alignment.py
#!/usr/bin/python

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (QApplication, QComboBox, QHBoxLayout, QLineEdit,
                             QWidget)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        combo = QComboBox(self)
        combo.addItem('Left')
        combo.addItem('Center')
        combo.addItem('Right')

        combo.activated.connect(self.onActivated)

        self.qle = QLineEdit(self)

        hbox.addWidget(combo)
        hbox.setSpacing(20)
        hbox.addWidget(self.qle)

        self.setLayout(hbox)

        self.setWindowTitle('Text alignment')
        self.show()

    def onActivated(self, idx):

        align = [Qt.AlignmentFlag.AlignLeft, Qt.AlignmentFlag.AlignCenter,
                 Qt.AlignmentFlag.AlignRight]

        self.qle.setAlignment(align[idx])


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

该示例包含一个带有三个选项的 QComboBox;这些选项将相邻 QLineEdit 中的文本向左、居中或向右对齐。

def onActivated(self, idx):

    align = [Qt.AlignmentFlag.AlignLeft, Qt.AlignmentFlag.AlignCenter,
                Qt.AlignmentFlag.AlignRight]

    self.qle.setAlignment(align[idx])

onActivated 回调中,我们使用 setAlignment 设置行编辑部件的对齐方式。

QLineEdit Alignment
图:QLineEdit 对齐

QLineEdit 回显模式

回显模式决定了在行编辑器中输入的文本如何向用户显示。在默认的 Normal 模式下,输入的文本会按原样显示。其他模式,包括 PasswordPasswordEchoOnEdit,会抑制或隐藏文本。

echo_mode.py
#!/usr/bin/python

import sys
from PyQt6.QtWidgets import (QWidget, QComboBox, QPushButton, QLineEdit,
                             QHBoxLayout, QApplication, QMessageBox)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        combo = QComboBox(self)
        combo.addItem('Normal')
        combo.addItem('Password')
        combo.addItem('PasswordEchoOnEdit')
        combo.addItem('NoEcho')

        combo.activated.connect(self.onActivated)

        self.qle = QLineEdit(self)

        showBtn = QPushButton('Show', self)
        showBtn.clicked.connect(self.onClicked)

        hbox.addWidget(combo)
        hbox.setSpacing(20)
        hbox.addWidget(self.qle)
        hbox.setSpacing(20)
        hbox.addWidget(showBtn)

        self.setLayout(hbox)

        self.setWindowTitle('Echo mode')
        self.show()

    def onActivated(self, idx):

        modes = [QLineEdit.EchoMode.Normal, QLineEdit.EchoMode.Password,
                 QLineEdit.EchoMode.PasswordEchoOnEdit, QLineEdit.EchoMode.NoEcho]

        self.qle.setEchoMode(modes[idx])

    def onClicked(self):

        text = self.qle.text()
        QMessageBox.information(self, 'info', text)


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

在这个示例中,我们可以使用 QComboBox 来选择回显模式。

def onActivated(self, idx):

    modes = [QLineEdit.EchoMode.Normal, QLineEdit.EchoMode.Password,
                QLineEdit.EchoMode.PasswordEchoOnEdit, QLineEdit.EchoMode.NoEcho]

    self.qle.setEchoMode(modes[idx])

回显模式通过 setEchoMode 设置。

QLineEdit echo mode
图:QLineEdit 回显模式

QLineEdit 文本验证

我们可以使用验证器来验证输入文本。

hex_validator.py
#!/usr/bin/python

import sys
from PyQt6.QtWidgets import (QWidget, QLabel, QLineEdit, QSizePolicy,
                             QHBoxLayout, QApplication)
from PyQt6.QtGui import QPalette, QColor, QRegularExpressionValidator
from PyQt6.QtCore import QRegularExpression

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        hbox = QHBoxLayout()

        label = QLabel('HEX colour:', self)

        rx = QRegularExpression("[0-9A-Fa-f]{6}")

        self.qle = QLineEdit(self)
        validator = QRegularExpressionValidator(rx)
        self.qle.setValidator(validator)

        self.qle.editingFinished.connect(self.onEditingFinished)

        self.colLabel = QLabel(self)
        self.colLabel.setSizePolicy(QSizePolicy.Policy.Expanding, 
            QSizePolicy.Policy.Expanding)
        self.colLabel.setAutoFillBackground(True)

        hbox.addWidget(label)
        hbox.addSpacing(20)
        hbox.addWidget(self.qle)
        hbox.addSpacing(20)

        hbox.addWidget(self.colLabel)
        pal = QPalette()
        pal.setColor(QPalette.ColorRole.Window, QColor('#333333'))
        self.colLabel.setPalette(pal)

        self.setLayout(hbox)
        self.resize(450, 200)
        self.setWindowTitle('Validator')
        self.show()

    def onEditingFinished(self):

        pal = QPalette()
        pal.setColor(QPalette.ColorRole.Window, QColor(f'#{self.qle.text()}'))
        self.colLabel.setPalette(pal)


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

在这个示例中,我们有一个用于验证十六进制格式颜色值(例如 #33fe56)的验证器。输入的颜色将用作 QLabel 部件的背景。

self.qle = QLineEdit(self)
validator = QRegularExpressionValidator(rx)
self.qle.setValidator(validator)

我们使用 QRegularExpressionValidator,它根据正则表达式验证字符串。该正则表达式指定了允许的字符,并用量词设置了固定长度。验证器通过 setValidator 应用。

self.qle.editingFinished.connect(self.onEditingFinished)

当按下回车键或行编辑器失去焦点时,会发出 editingFinished 信号。只有在验证器通过时才会发出此信号。

def onEditingFinished(self):

    pal = QPalette()
    pal.setColor(QPalette.ColorRole.Window, QColor(f'#{self.qle.text()}'))
    self.colLabel.setPalette(pal)

所选颜色将应用于标签。

QLineEdit validator
图:QLineEdit 验证器

QLineEdit 自动补全

可以使用 setCompleter 提供自动补全功能。

completer.py
#!/usr/bin/python

import sys
from PyQt6.QtWidgets import (QWidget, QLabel, QCompleter, QLineEdit,
                             QHBoxLayout, QApplication)

data = [
    'Afghanistan', 'Albania', 'Algeria', 'Andorra', 'Angola', 'Antigua & Deps',
    'Argentina', 'Armenia', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas',
    'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize',
    'Benin', 'Bhutan', 'Bolivia', 'Bosnia Herzegovina', 'Botswana',
    'Brazil', 'Brunei', 'Bulgaria', 'Burkina', 'Burundi', 'Cambodia', 'Cameroon',
    'Canada', 'Cape Verde', 'Central African Rep', 'Chad', 'Chile', 'China',
    'Colombia', 'Comoros', 'Congo', 'Congo {Democratic Rep}', 'Costa Rica',
    'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', 'Denmark', 'Djibouti',
    'Dominica', 'Dominican Republic', 'East Timor', 'Ecuador', 'Egypt',
    'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia',
    'Fiji', 'Finland', 'France', 'Gabon', 'Gambia', 'Georgia', 'Germany',
    'Ghana', 'Greece', 'Grenada', 'Guatemala', 'Guinea', 'Guinea-Bissau',
    'Guyana', 'Haiti', 'Honduras', 'Hungary', 'Iceland', 'India', 'Indonesia',
    'Iran', 'Iraq', 'Ireland', 'Israel', 'Italy', 'Ivory Coast', 'Jamaica',
    'Japan', 'Jordan', 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea North',
    'Korea South', 'Kosovo', 'Kuwait', 'Kyrgyzstan', 'Laos', 'Latvia',
    'Lebanon', 'Lesotho', 'Liberia', 'Libya', 'Liechtenstein', 'Lithuania',
    'Luxembourg', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives',
    'Mali', 'Malta', 'Marshall Islands', 'Mauritania', 'Mauritius', 'Mexico',
    'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Morocco',
    'Mozambique', 'Myanmar', 'Namibia', 'Nauru', 'Nepal', 'Netherlands',
    'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Norway', 'Oman', 'Pakistan',
    'Palau', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines',
    'Poland', 'Portugal', 'Qatar', 'Romania', 'Russian Federation', 'Rwanda',
    'St Kitts & Nevis', 'St Lucia', 'Saint Vincent & the Grenadines',
    'Samoa', 'San Marino', 'Sao Tome & Principe', 'Saudi Arabia', 'Senegal',
    'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia', 'Slovenia',
    'Solomon Islands', 'Somalia', 'South Africa', 'South Sudan', 'Spain',
    'Sri Lanka', 'Sudan', 'Suriname', 'Swaziland', 'Sweden', 'Switzerland',
    'Syria', 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', 'Togo', 'Tonga',
    'Trinidad & Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Tuvalu', 'Uganda',
    'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States',
    'Uruguay', 'Uzbekistan', 'Vanuatu', 'Vatican City', 'Venezuela', 'Vietnam',
    'Yemen', 'Zambia', 'Zimbabwe'
]


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        label = QLabel('Enter country: ')

        self.qle = QLineEdit(self)
        completer = QCompleter(data)
        self.qle.setCompleter(completer)

        hbox.addWidget(label)
        hbox.addSpacing(20)
        hbox.addWidget(self.qle)

        self.setLayout(hbox)

        self.setWindowTitle('Completer')
        self.show()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

我们有一个示例,在其中我们输入一个国家名称。QLineEdit 会在我们输入时提示国家名称。

data = [
    'Afghanistan', 'Albania', 'Algeria', 'Andorra', 'Angola','Antigua & Deps',
    'Argentina', 'Armenia', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas',
    'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize',
...

我们有一个国家列表。

self.qle = QLineEdit(self)
completer = QCompleter(data)
self.qle.setCompleter(completer)

我们将列表传递给 QCompleter,并使用 setCompleter 将补全器设置到行编辑部件。

QLineEdit completer
图:QLineEdit 自动补全

在本文中,我们学习了如何使用 PyQt 的 QLineEdit

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了超过 1400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 PyQt 教程