您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了怎么實(shí)現(xiàn)PyQt5文本輸入框自動補(bǔ)全QLineEdit,內(nèi)容簡而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
一、QCompleter類
自動補(bǔ)全會用到的一個類
主要代碼
def init_lineedit(self): # 增加自動補(bǔ)全 self.completer = QCompleter(items_list) # 設(shè)置匹配模式 有三種: Qt.MatchStartsWith 開頭匹配(默認(rèn)) Qt.MatchContains 內(nèi)容匹配 Qt.MatchEndsWith 結(jié)尾匹配 self.completer.setFilterMode(Qt.MatchContains) # 設(shè)置補(bǔ)全模式 有三種: QCompleter.PopupCompletion(默認(rèn)) QCompleter.InlineCompletion QCompleter.UnfilteredPopupCompletion self.completer.setCompletionMode(QCompleter.PopupCompletion) # 給lineedit設(shè)置補(bǔ)全器 self.lineedit.setCompleter(self.completer) def init_combobox(self): # 增加選項(xiàng)元素 for i in range(len(items_list)): self.combobox.addItem(items_list[i]) self.combobox.setCurrentIndex(-1) # 增加自動補(bǔ)全 self.completer = QCompleter(items_list) self.completer.setFilterMode(Qt.MatchContains) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.combobox.setCompleter(self.completer)
完整代碼:
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * ################################################ items_list=["C","C++","Java","Python","JavaScript","C#","Swift","go","Ruby","Lua","PHP"] ################################################ class Widget(QWidget): def __init__(self, *args, **kwargs): super(Widget, self).__init__(*args, **kwargs) layout = QHBoxLayout(self) self.lineedit = QLineEdit(self, minimumWidth=200) self.combobox = QComboBox(self, minimumWidth=200) self.combobox.setEditable(True) layout.addWidget(QLabel("QLineEdit", self)) layout.addWidget(self.lineedit) layout.addItem(QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)) layout.addWidget(QLabel("QComboBox", self)) layout.addWidget(self.combobox) #初始化combobox self.init_lineedit() self.init_combobox() #增加選中事件 self.combobox.activated.connect(self.on_combobox_Activate) def init_lineedit(self): # 增加自動補(bǔ)全 self.completer = QCompleter(items_list) # 設(shè)置匹配模式 有三種: Qt.MatchStartsWith 開頭匹配(默認(rèn)) Qt.MatchContains 內(nèi)容匹配 Qt.MatchEndsWith 結(jié)尾匹配 self.completer.setFilterMode(Qt.MatchContains) # 設(shè)置補(bǔ)全模式 有三種: QCompleter.PopupCompletion(默認(rèn)) QCompleter.InlineCompletion QCompleter.UnfilteredPopupCompletion self.completer.setCompletionMode(QCompleter.PopupCompletion) # 給lineedit設(shè)置補(bǔ)全器 self.lineedit.setCompleter(self.completer) def init_combobox(self): # 增加選項(xiàng)元素 for i in range(len(items_list)): self.combobox.addItem(items_list[i]) self.combobox.setCurrentIndex(-1) # 增加自動補(bǔ)全 self.completer = QCompleter(items_list) self.completer.setFilterMode(Qt.MatchContains) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.combobox.setCompleter(self.completer) def on_combobox_Activate(self, index): print(self.combobox.count()) print(self.combobox.currentIndex()) print(self.combobox.currentText()) print(self.combobox.currentData()) print(self.combobox.itemData(self.combobox.currentIndex())) print(self.combobox.itemText(self.combobox.currentIndex())) print(self.combobox.itemText(index)) if __name__ == "__main__": app = QApplication(sys.argv) w = Widget() w.show() sys.exit(app.exec_())
二、QStandardItemModel類
最終效果
import sys # from PyQt5.Qt import QCompleter from PyQt5.Qt import QStandardItemModel from PyQt5.QtCore import Qt from PyQt5.QtCore import pyqtSlot from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QFrame from PyQt5.QtWidgets import QLabel from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QLineEdit from PyQt5.QtWidgets import QTextEdit from PyQt5.QtWidgets import QCompleter from PyQt5.QtWidgets import QSizePolicy from PyQt5.QtWidgets import QMainWindow from PyQt5.QtWidgets import QPushButton from PyQt5.QtWidgets import QGridLayout from PyQt5.QtWidgets import QApplication from View import interface class MainWindow(QMainWindow): def __init__(self): super(MainWindow,self).__init__(None) self.setWindowTitle("對金屬腐蝕性試驗(yàn)儀") self.initUI() def initUI(self): layout = QGridLayout() layout.setSpacing(10) self.loginLabel = QLabel("郵箱:") self.loginLabel.setAlignment(Qt.AlignRight) self.loginLabel.setStyleSheet("color:rgb(20,20,20,255);font-size:16px;font-weight:bold:text") self.loginTxt = QLineEdit() self.loginTxt.setText("admin") self.loginTxt.setPlaceholderText("User Name") self.loginTxt.setClearButtonEnabled(True) self.loginTxt.textChanged.connect(self.on_loginTxt_textChanged) #綁定槽函數(shù) self.m_model = QStandardItemModel(0, 1, self) m_completer = QCompleter(self.m_model, self) self.loginTxt.setCompleter(m_completer) m_completer.activated[str].connect(self.onTxtChoosed) self.pwdLabel = QLabel("密碼:") self.pwdLabel.setAlignment(Qt.AlignRight) self.pwdTxt = QLineEdit() self.pwdTxt.setContextMenuPolicy(Qt.NoContextMenu) #禁止復(fù)制粘貼 self.pwdTxt.setPlaceholderText("Password") self.pwdTxt.setText("admin") self.pwdTxt.setEchoMode(QLineEdit.Password) self.pwdTxt.setClearButtonEnabled(True) self.registeredBtn = QPushButton("注冊") self.loginBtn = QPushButton("登陸") self.headLabel = QLabel("用戶登陸") self.headLabel.resize(300,30) self.headLabel.setAlignment(Qt.AlignCenter) self.headLabel.setStyleSheet("color:rgb(10,10,10,255);font-size:25px;font-weight:bold;font-family:Roman times;") self.headLabel.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding) layout.addWidget(self.headLabel,0,0,1,2) policy = self.headLabel.sizePolicy() print(policy.verticalPolicy()) policy.setVerticalPolicy(1) print(policy.verticalPolicy()) # policy.setVerticalPolicy(1) layout.addWidget(self.loginLabel,1,0) layout.addWidget(self.loginTxt,1,1) layout.addWidget(self.pwdLabel,2,0) layout.addWidget(self.pwdTxt,2,1) layout.addWidget(self.registeredBtn,3,0) layout.addWidget(self.loginBtn,3,1) frame = QFrame(self) frame.setLayout(layout) self.setCentralWidget(frame) self.resize(300,150) def onTxtChoosed(self, txt): self.loginTxt.setText(txt) @pyqtSlot(str) def on_loginTxt_textChanged(self, text): if '@' in self.loginTxt.text(): return emaillist = ["@163.com", "@qq.com", "@gmail.com", "@live.com", "@126.com", "@139.com"] self.m_model.removeRows(0, self.m_model.rowCount()) for i in range(0, len(emaillist)): self.m_model.insertRow(0) self.m_model.setData(self.m_model.index(0, 0), text + emaillist[i]) if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() mainWindow.activateWindow() mainWindow.raise_() app.exec_() del mainWindow del app
QStandardItemModel類為存儲自定義數(shù)據(jù)提供了一個通用模型。
QStandardItemModel可以用作標(biāo)準(zhǔn)Qt數(shù)據(jù)類型的存儲庫。它是模型/視圖類之一,是Qt的模型/視圖框架的一部分。
QStandardItemModel提供了一個經(jīng)典的基于項(xiàng)目的方法來處理模型。 QStandardItemModel中的項(xiàng)目由QStandardItem提供。
QStandardItemModel實(shí)現(xiàn)了QAbstractItemModel接口,這意味著該模型可用于在支持該接口的任何視圖(如QListView,QTableView和QTreeView以及您自己的自定義視圖)中提供數(shù)據(jù)。為了提高性能和靈活性,您可能希望子類QAbstractItemModel為不同類型的數(shù)據(jù)存儲庫提供支持。例如,QDirModel為底層文件系統(tǒng)提供了一個模型接口。
當(dāng)你想要一個列表或樹時,你通常會創(chuàng)建一個空的QStandardItemModel并使用appendRow()向模型添加項(xiàng)目,使用item()來訪問項(xiàng)目。如果您的模型表示一個表格,您通常會將表格的維度傳遞給QStandardItemModel構(gòu)造函數(shù),并使用setItem()將項(xiàng)目放入表格中。您還可以使用setRowCount()和setColumnCount()來更改模型的尺寸。要插入項(xiàng)目,請使用insertRow()或insertColumn(),并刪除項(xiàng)目,請使用removeRow()或removeColumn()。
您可以使用setHorizontalHeaderLabels()和setVerticalHeaderLabels()來設(shè)置模型的標(biāo)題標(biāo)簽。
您可以使用findItems()在模型中搜索項(xiàng)目,并通過調(diào)用sort()對模型進(jìn)行排序。
調(diào)用clear()從模型中移除所有項(xiàng)目。
2.2 代碼理解
self.loginTxt = QLineEdit() self.loginTxt.setText("admin") self.loginTxt.setPlaceholderText("User Name") self.loginTxt.setClearButtonEnabled(True) 0 self.loginTxt.textChanged.connect(self.on_loginTxt_textChanged) #綁定槽函數(shù) 1 self.m_model = QStandardItemModel(0, 1, self) 2 m_completer = QCompleter(self.m_model, self) 3 self.loginTxt.setCompleter(m_completer) 4 m_completer.activated[str].connect(self.onTxtChoosed) def onTxtChoosed(self, txt): self.loginTxt.setText(txt) @pyqtSlot(str) def on_loginTxt_textChanged(self, text): if '@' in self.loginTxt.text(): return emaillist = ["@163.com", "@qq.com", "@gmail.com", "@live.com", "@126.com", "@139.com"] self.m_model.removeRows(0, self.m_model.rowCount()) for i in range(0, len(emaillist)): self.m_model.insertRow(0) self.m_model.setData(self.m_model.index(0, 0), text + emaillist[i])
0-將文本改變信號連接到on_loginTxt_textChanged 函數(shù)處理
以上就是關(guān)于怎么實(shí)現(xiàn)PyQt5文本輸入框自動補(bǔ)全QLineEdit的內(nèi)容,如果你們有學(xué)習(xí)到知識或者技能,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。