c++ - 使用可编辑的 QComboBox 从列表中选择值或获取手动输入

标签 c++ qt4 qcombobox

我正在尝试使用 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/

相关文章:

c++ - 从变量转换时出现 std::chrono::time_point 编译器错误

c++ - QStatusBar->showMessage() 的问题

qt - 下拉列表中所选项目的 QComboBox 样式

c++ - Qt : C++ dynamic parameter GUI for plugin parameters

qt - QComboBox 的初始项目是否可以显示比项目列表中更短的文本项目?

python - 获取 QComboBox 的所有项目 - PyQt4 (Python)

c++ - 具有不同 const 正确性的 vector 的赋值运算符

c++ - 在多个函数之间共享一个 vector ,我的程序没有按预期工作。

c++ - 在 MatLab 中执行 CUDA mexfunction 期间尝试保存到 .txt 时出错

qt - 复选框的组合框?