我正在尝试使用 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 地址将手动条目添加到列表中,但这不是必需的。
最佳答案
我认为,您的扫描为您的数据模型提供了所有可能的服务器。在这种情况下,您不需要将用户输入添加到您的数据中,而只需选择现有项目。 要允许输入已知 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
使用事件过滤器:
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
关于c++ - 使用可编辑的 QComboBox 从列表中选择值或获取手动输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25430000/