Qcompleter自动完成pyqt5不显示选项作为i类型



我使用Qcombobox添加了一个下拉菜单。它有三个选项:B4, B4.5, B5如果用户选择B4.5并开始在QlineEdit中输入,则应该根据列表"名称"出现自动填充选项。但这并没有发生。我做错了什么?下面是代码:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QCompleter
import sys
from PyQt5.Qt import QApplication, QLabel, QLineEdit

class KnowledgeBaseGui(QMainWindow):
def __init__(self):
super().__init__()
self.mwidget = QMainWindow(self)
self.layout = QGridLayout()
self.setLayout(self.layout)
self.setGeometry(500, 400, 650, 650)
self.setWindowTitle("pyqt5")
self.nand_cmd_menu_current_text = None
def cmd_button(self):
self.combo_cmd = QComboBox(self)
self.combo_cmd.setGeometry(80, 175, 115, 35)
self.combo_cmd.setFont(QFont('Times', 11))
self.combo_cmd.setStyleSheet("background-color: rgb(166,180,242);border: 2px solid rgb(20,20,20)")
self.combo_cmd.addItems(["CMDs", "B4.5", "B5", "B6"])
self.combo_cmd.currentTextChanged.connect(self.design_manual_select)
pass_val = self.design_manual_select(self.nand_cmd_menu_current_text)

def design_manual_select(self, val):
names = ["apple", "alpha", "beta", "blackberry", "charlie", "delta", "chilton", "dawn"]
cmd_lineEdit = QLineEdit(self)
cmd_lineEdit.setGeometry(200, 175, 150, 35)
if val == "B4.5":
print(val)
completer = QCompleter(names)
cmd_lineEdit.setCompleter(completer)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)  # To create the App
app.setStyleSheet("QMainWindow{"
"background-image:url(abc.jpg); background-color: rgb(130,130,125);"
"border: 1px solid rgb(1,1,1)}")
CallKnowledgeBaseGui = KnowledgeBaseGui()
CallKnowledgeBaseGui.cmd_button()
CallKnowledgeBaseGui.show()
sys.exit(app.exec())  # To start the App

好吧,说实话,有一些事情是错误的。

  1. 你正在创建一个你不使用的子QMainWindow(无论如何子主窗口很少使用);
  2. 你正在创建一个布局,但你没有使用它,因为你没有添加小部件到它;
  3. QMainWindow不支持设置布局,应该使用一个中央小部件(有自己的布局);
  4. design_manual_select在启动时调用,但理论上该函数应该在用户交互时调用;
  5. 该函数不断创建一个新的QLineEdit,补全器设置在其上,并且新的行编辑永远不会显示(在构造函数中使用父元素创建的小部件和未添加到布局的如果父元素已经可见,则不会自动显示);
  6. 如果当前组合项是而不是B4.5,则没有重置补全器的功能;

那么,让我们来修复这些:

  1. 一个QWidget必须被设置为中心widget,并且必须为它设置一个布局;
  2. 小部件必须添加到该布局中,只有一次;
  3. 由于补全器必须在当前文本更改时更改,如果文本不匹配,则必须正确更新;
class KnowledgeBaseGui(QMainWindow):
def __init__(self):
super().__init__()
self.mwidget = QWidget()
self.setCentralWidget(self.mwidget)
self.layout = QGridLayout(self.mwidget)
self.setGeometry(500, 400, 650, 650)
self.setWindowTitle("pyqt5")
self.combo_cmd = QComboBox()
self.combo_cmd.setFont(QFont('Times', 11))
self.combo_cmd.setStyleSheet("background-color: rgb(166,180,242);border: 2px solid rgb(20,20,20)")
self.combo_cmd.addItems(["CMDs", "B4.5", "B5", "B6"])
self.layout.addWidget(self.combo_cmd)
self.combo_cmd.currentTextChanged.connect(self.design_manual_select)
self.cmd_lineEdit = QLineEdit()
self.layout.addWidget(self.cmd_lineEdit)
def design_manual_select(self, val):
if val == "B4.5":
names = ["apple", "alpha", "beta", "blackberry", "charlie", "delta", "chilton", "dawn"]
self.cmd_lineEdit.setCompleter(QCompleter(names))
else:
self.cmd_lineEdit.setCompleter(None)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet("QMainWindow{"
"background-image:url(abc.jpg); background-color: rgb(130,130,125);"
"border: 1px solid rgb(1,1,1)}")
callKnowledgeBaseGui = KnowledgeBaseGui()
callKnowledgeBaseGui.show()
sys.exit(app.exec())

最新更新