我正在尝试使用QComboBox来允许用户手动输入IP地址或从值列表中选择服务器。我将QComboBox设置为可编辑,默认情况下为空列表。有一个扫描功能可以在网络上查找服务器并将条目添加到QComboBox列表中。该列表显示服务器的名称,而IP地址存储在该条目的数据中。
我正在尝试使用currentIndex()函数来确定它是否是手动IP地址(如果currentIndex()== -1)或选择了哪个条目。
如果我在扫描之前手动输入IP地址(因此QComboBox列表为空)可以正常工作。 currentIndex()为-1,它从QComboBox文本中解析IP。但是,一旦我扫描并添加到列表中,currentIndex()似乎只返回列表索引(0+)。此外,当项目添加到QComboBox列表时,将自动选择第一个项目(索引0)。
关于我需要做什么才能让这项工作按照我想要的方式进行的任何想法?我是否需要一个“空白”列表条目作为手动输入的占位符(空字符串或“输入IP地址”提示符)?我是否需要注意在QComboBox中键入并将其设置为索引-1(或其他)?我是否需要使用除索引之外的内容来确定是否有手动输入?
我有一个正则表达式来限制QComboBox中的输入看起来像一个IP地址。这似乎有效,但是一旦添加了列表条目,我就可以输入字母开头了。它似乎试图自动完成列表条目(由于我显示了名称,因此不遵循正则表达式)。我认为我对此行为没有问题,因为一旦我键入数字,它就会坚持使用IP格式。我不希望能够编辑列表条目。一旦建立连接(如历史模式),我可以通过IP地址将手动输入添加到列表中,但这不是必需的。
答案 0 :(得分:1)
我认为,您的扫描为您的数据模型提供了所有可能的服务器。在这种情况下,您不需要为数据添加用户输入,而只需选择现有项目。 要允许输入已知的ip,您应该添加一个空字符串作为第一项。然后,您可以使用信号editTextChanged或eventFilter来检查输入并选择服务器。我在python3,pyqt5,qt5中尝试过,为此尝试我将一些服务器存储在字典中。在这两种情况下,在输入现有ip之后选择了正确的服务器:
首先列出我的值:
self.combo.setInsertPolicy(0) # if no input necessary
self.item_dict = {
'123.456.7.890':'server1',
'234.567.8.901':'server2',
'345.678.9.012':'server3',
'456.789.0.123':'server4'
}
self.comboSetItems()
def comboSetItems(self):
self.combo.addItem('') # this item should be edited
for val in self.item_dict:
self.combo.addItem(self.item_dict[val])
使用信号:
self.combo.editTextChanged.connect(self.itemEdited)
def itemEdited(self,string):
# every input sends the signal :-(
if string in self.item_dict:
for i in range(0,self.combo.count()):
if self.item_dict[string] == self.combo.itemText(i):
self.combo.clearEditText()
self.combo.setCurrentIndex(i)
else:
pass
使用eventFilter:
self.combo.installEventFilter(self)
def eventFilter(self,obj,event):
if obj == self.combo:
if event.type() == QtCore.QEvent.KeyPress and event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
if self.combo.currentText() in self.item_dict:
for i in range(0,self.combo.count()):
if self.combo.itemText(i) == self.item_dict[self.combo.currentText()]:
self.combo.clearEditText()
self.combo.setCurrentIndex(i)
else:
pass
return True