- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在开发一个命令行工具,现在我正在为其制作一个 PyQT GUI。我想使用 readline 模块获取当前的自动完成实现,并将其放入 QLineEdit 文本框中。这可能吗?你有什么建议吗?
这是我用 readline 模块做的事情的一个例子:
import readline
values = ['these','are','my','autocomplete','words']
completions = {}
def completer(text,state):
try:
matches = completions[text]
except KeyError:
matches = [value for value in values if text.upper() in value.upper()]
completions[text] = matches
try:
return matches[state]
except IndexError:
return None
readline.set_completer(completer)
readline.parse_and_bind('tab: menu-complete')
whie 1:
text = raw_input('> ')
text.dostuff()
最终,如果我不能让 readline 模块在 QLineEdit 小部件中工作,我最终想做的是在一个单词列表上完成,能够用 +- 等符号分隔多个单词*/() 等...
谢谢!
最佳答案
我可以告诉你,首先,尝试围绕新功能包装 QCompleter 是一件非常痛苦的事情。您必须能够满足 QCompleter 的所有接口(interface),并围绕该实际代码桥接它。
您必须手动更新 QCompleter 上的 QStringListModel 集,并为给定的搜索前缀提供获取当前完成和完成总数的实现。
这是一个与 PopupCompletion 模式兼容的工作示例:
import re
class ReadlineCompleter(QtGui.QCompleter):
def __init__(self, completeFn, *args, **kwargs):
super(ReadlineCompleter, self).__init__(*args, **kwargs)
self._completer = completeFn
self.setModel(QtGui.QStringListModel())
self.update()
def setCompletionPrefix(self, val):
super(ReadlineCompleter, self).setCompletionPrefix(val)
self.update()
def currentCompletion(self):
state = self.currentRow()
return self._completionAt(state)
def completionCount(self):
state = 0
while True:
result = self._completionAt(state)
if not result:
break
state += 1
return state
def update(self):
matches = [self._completionAt(i) for i in xrange(self.completionCount())]
self.model().setStringList(matches)
def _completionAt(self, state):
text = str(self.completionPrefix())
# regex to split on any whitespace, or the char set +*/^()-
match = re.match(r'^(.*)([\s+*/^()-]+)(.*)$', text)
if match:
prefix, sep, text = match.groups()
result = self._completer(str(text), state)
if result and match:
result = sep.join([prefix, result])
return '' if result is None else result
请注意,在 _completionAt()
方法中,我添加了您想要的额外功能,用于检测分隔符模式。你可以很明显地调整这个。但它会拆分最后一部分并使用该值来检查是否完成,然后再次使用前缀重新加入结果。
用法
重要。您需要将 QLineEdit 的 textChanged
信号连接到完成器以强制更新。否则,将不会在完成器中使用任何功能。
line = QtGui.QLineEdit()
comp = ReadlineCompleter(completer)
comp.setCompletionMode(comp.PopupCompletion)
line.setCompleter(comp)
# important
line.textChanged.connect(comp.setCompletionPrefix)
有examples here显示其他人如何必须在自定义行编辑中填写功能,他们完全绕过完成者的标准信号并自己触发。你可以看到它的一点点努力。
关于PyQt QLineEdit 与 readline 完成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401367/
我在配置小部件上有多个 QLineEdit 小部件。 当配置文本更改时,我想存储更新后的值(其中有几个,所以我不想在最后的一个函数调用中传递它们)。 我正在考虑将它们连接到一个插槽或通过 QSigna
我有一个 QLineEdit我已经将图像设置为 QStackedWidget .现在我想更改 QLineEdit 中文本的字体颜色.怎么做? QLineEdit *line1 = new QLineE
我正在尝试编写一个简单的 Qt 程序,该程序在 QLineEdit 中获取文本,并在按下返回键时将其附加到 QTextEdit 对象中。 这是我的程序的代码: #include #include
我有一个QLineEdit,其中包含文本“搜索内容...”。 我希望当 QLineEdit 获得焦点或当光标进入文本内部时,文本被设置为空字符串。 [这有效:我没问题,我使用了 QLineEdit 的
如何在QMenu中将QLineEdit用作菜单项?有解决方案吗? 只是要做这样的事情(请看头像下方的编辑框): 最佳答案 您可以使用QWidgetAction来包含您的QLineEdit。它继承了QA
我引入了一个特定的自定义快捷键,允许从当前文本光标位置开始删除 QLineEdit 中接下来的 10 个字符。但我想让这个不可撤销。不幸的是,QLineEdit 不提供 QTextDocument 或
我有一个带有 QDoubleValidator 的 QLineEdit,调用 QDoubleValidator::setRange 不会验证 QLineEdit top() ) {
如何在 QLineEdit 上设置输入验证器以将其限制为有效的 IP 地址?即 x.x.x.x,其中 x 必须在 0 到 255 之间。并且 x 不能为空 最佳答案 您正在寻找QRegExp和 QVa
如果用户在 QLineEdit 中键入文本并离开 QLineEdit 输入字段,我想执行一些操作。 关于focusInEvent 的解释不多。我正在使用 Python 和 PySide2。但所有信息都
我正在使用 Qt 样式表创建一个自定义 QLineEdit,当它有焦点时,它周围有一个浅蓝色边框。这是样式表: this->setStyleSheet(" QLineEdit { "
我正在尝试制作一个带有行编辑和按钮的小部件。如果单击该按钮,它应该打开一个文件对话框,我可以在其中选择一个文件。文件名应该显示在行编辑中。这是我到目前为止得到的: #include "widget_o
我正在 python 上使用 PyQt5 制作一个登录 GUI 程序,在这个程序中我在此布局上创建了一个键盘。我的问题是,我无法使用我所做的键盘在 QLineEdit 上插入文本。我应该做什么来修复它
我想在某些条件下,不可能编辑 QLineEdit 小部件。理想情况下,它看起来像: QLE_On = QCheckBox("Non-editable?") generic = QLineEdit()
我正在从行编辑中获取用户输入并将其显示在 QMessageBox 上,但由于某种原因它不会显示。我想也许我根本没有从 QLineEdit 获取输入,但是当我尝试在终端上打印它时(顺便说一句,它仍然不会
是否可以在输入时使用 QValidator 设置 QLineEdit 的文本?如果是这样,有人可以插入如何实现这一目标的正确方向吗?谢谢。 最佳答案 您只需覆盖验证方法: from PyQt5 imp
我使用pyqt开发一个对话框,和一个LineEidt有些像下面这样,但我无法从 lineEdit1 获取任何内容: lineEdit1 = QtGui.QLineEdit() lineEdit1.se
我有一个(希望如此)简单的问题: 我创建了一个具有表单 (form.ui) 的新类。在这种形式中,我想构建某些 lineEdits。我想通过编码而不是拖放来做到这一点。我可以想到两种不同的方法来做到这
我想让 QLineEdit 看起来像 QLabel 如果它处于非事件状态则带有粗体文本,如果它像 QLineEdit 如果处于事件状态则具有正常粗细。在我的理解中,“事件”= 当显示文本光标并且用户可
QLineEdit 在 .clear() 或 .setText() 方法上触发信号。因此,每次使用这些方法来阻止 LineEdit 发出信号时,我都需要 .blockSignals(True) 然后是
我使用 QT Designer 绘制了一个 UI,但发现没有参数可让我将 QLineEdit 输入设置为大写。 在网上搜索了一些之后,我只看到了极少数满足我需要的结果,但是都是用 Qt 编码的。例如,
我是一名优秀的程序员,十分优秀!