Python编程实例-PyQt5 GUI编程-Widgets-QLineEdit

Python编程实例-PyQt5 GUI编程-Widgets-QLineEdit,第1张

QLineEdit

QLineEdit 小部件是一个简单的单行文本编辑框,用户可以在其中输入内容。 这些用于表单字段或没有有效输入限制列表的设置。 例如,输入电子邮件地址或计算机名称时。

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

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

1、QLineEdit创建
import sys

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


class MainWindow(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.resize(250, 200)
        self.setWindowTitle('QLineEdit')
        self.show()

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


def main():
    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

上面示例显示了一个行编辑小部件和一个标签。 我们在行编辑中键入的文本会立即显示在标签小部件中。

qle = QLineEdit(self)

如果行编辑小部件中的文本发生更改,我们调用 onChanged 方法:

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

在 onChanged 方法中,我们将输入的文本设置为标签小部件。 我们调用 adjustSize 方法将标签的大小调整为文本的长度。

2、文本对齐

QLineEdit小部件的文本可以使用setAlignment对齐:

import sys

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

class MainWindow(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[str].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, text):

        if text == 'Left':
            self.qle.setAlignment(Qt.AlignLeft)
        elif text == 'Center':
            self.qle.setAlignment(Qt.AlignCenter)
        else:
            self.qle.setAlignment(Qt.AlignRight)


def main():

    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

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

def onActivated(self, text):
    if text == 'Left':
        self.qle.setAlignment(Qt.AlignLeft)
    elif text == 'Center':
        self.qle.setAlignment(Qt.AlignCenter)
    else:
        self.qle.setAlignment(Qt.AlignRight)

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

3、回显模式

回显模式决定了在行编辑中输入的文本如何显示给用户。 在默认的普通模式下,输入的文本会逐字显示。 其他模式,包括 PasswordPasswordEchoOnEdit 会抑制或隐藏文本。

import sys
from PyQt5.QtWidgets import (QWidget, QComboBox, QPushButton, QLineEdit,
    QHBoxLayout, QApplication, QMessageBox)
from PyQt5.QtCore import Qt

class MainWindow(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[str].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.resize(320, 240)
        self.show()

    def onActivated(self, text):
        if text == 'Normal':
            self.qle.setEchoMode(QLineEdit.EchoMode.Normal)
        elif text == 'Password':
            self.qle.setEchoMode(QLineEdit.EchoMode.Password)
        elif text == 'PasswordEchoOnEdit':
            self.qle.setEchoMode(QLineEdit.EchoMode.PasswordEchoOnEdit)
        elif text == 'NoEcho':
            self.qle.setEchoMode(QLineEdit.EchoMode.NoEcho)
            
    def onClicked(self):
        text = self.qle.text()
        QMessageBox.information(self, 'info', text)

def main():
    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

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

def onActivated(self, text):
    if text == 'Normal':
        self.qle.setEchoMode(QLineEdit.EchoMode.Normal)
    elif text == 'Password':
        self.qle.setEchoMode(QLineEdit.EchoMode.Password)
    elif text == 'PasswordEchoOnEdit':
        self.qle.setEchoMode(QLineEdit.EchoMode.PasswordEchoOnEdit)
    elif text == 'NoEcho':
        self.qle.setEchoMode(QLineEdit.EchoMode.NoEcho)

运行结果:

4、文本验证

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

import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QSizePolicy,
    QHBoxLayout, QApplication)
from PyQt5.QtGui import QRegExpValidator, QPalette, QColor
from PyQt5.QtCore import QRegExp

class MainWindow(QWidget):
    
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout()

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

        self.qle = QLineEdit(self)
        validator = QRegExpValidator(QRegExp("[0-9A-Fa-f]{6}"))
        self.qle.setValidator(validator)

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

        self.colLabel = QLabel(self)
        self.colLabel.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.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.Background, 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.Background, QColor(f'#{self.qle.text()}'))
        self.colLabel.setPalette(pal)


def main():

    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

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

self.qle = QLineEdit(self)
validator = QRegExpValidator(QRegExp("[0-9A-Fa-f]{6}"))
self.qle.setValidator(validator)

我们使用QRegExpValidator来根据正则表达式验证字符串。 正则表达式指定允许的字符并使用量词设置固定长度。 验证器与 setValidator 一起应用。

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

当按下 Enter 键或行编辑失去焦点时,会发出 editingFinished 信号。 仅当验证器通过时才会发出信号。

def onEditingFinished(self):
    pal = QPalette()
    pal.setColor(QPalette.Background, QColor(f'#{self.qle.text()}'))
    self.colLabel.setPalette(pal)

运行结果:

5、自动填充

可以使用 setCompleter 提供自动完成功能。

import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QCompleter, QLineEdit,
    QHBoxLayout, QApplication)
from PyQt5.QtCore import Qt

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 MainWindow(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 = MainWindow()
    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',
...

并将该数据传递给QCompleter,调用QLineEdit的setCompleterQCompleter绑定到QLineEdit:

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

运行结果如下:

6、输入过滤

可以使用输入掩码执行输入验证,以定义支持哪些字符以及在何处支持:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def window():
   app = QApplication(sys.argv)
   win = QWidget()
	
   e1 = QLineEdit()
   e1.setValidator(QIntValidator())
   e1.setMaxLength(4)
   e1.setAlignment(Qt.AlignRight)
   e1.setFont(QFont("Arial",20))
	
   e2 = QLineEdit()
   e2.setValidator(QDoubleValidator(0.99,99.99,2))
	
   flo = QFormLayout()
   flo.addRow("integer validator", e1)
   flo.addRow("Double validator",e2)
	
   e3 = QLineEdit()
   e3.setInputMask('+99_9999_999999')
   flo.addRow("Input Mask",e3)
	
   e4 = QLineEdit()
   e4.textChanged.connect(textchanged)
   flo.addRow("Text changed",e4)
	
   e5 = QLineEdit()
   e5.setEchoMode(QLineEdit.Password)
   flo.addRow("Password",e5)
	
   e6 = QLineEdit("Hello Python")
   e6.setReadOnly(True)
   flo.addRow("Read Only",e6)
	
   e5.editingFinished.connect(enterPress)
   win.setLayout(flo)
   win.setWindowTitle("PyQt")
   win.show()
	
   sys.exit(app.exec_())

def textchanged(text):
   print "contents of text box: "+text
	
def enterPress():
   print "edited"

if __name__ == '__main__':
   window()

运行结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/883642.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存