gpt4 book ai didi

python - PyQt5 中的信号和槽

转载 作者:行者123 更新时间:2023-12-01 07:42:07 24 4
gpt4 key购买 nike

我一直在尝试将以下代码转换为 PyQt5。将 QtGui.QTextEdit 更改为 QtWidgets.QTextEdit 并进行其他小修改后,我陷入了困境:

self.connect(self, QtCore.SIGNAL("activated(const QString&)"), self.changeCompletion)

MyDictionaryCompleter 类中。

PyQT5 中的信号和槽功能似乎已更新。我该怎么做?还会有其他问题吗?

这是代码:

from PyQt4 import QtGui, QtCore

class MyTextEdit(QtGui.QTextEdit):

def __init__(self, *args):
#*args to set parent
QtGui.QLineEdit.__init__(self,*args)
font=QtGui.QFont()
font.setPointSize(12)
self.setFont(font)
self.completer = None

def setCompleter(self, completer):
if self.completer:
self.disconnect(self.completer, 0, self, 0)
if not completer:
return

completer.setWidget(self)
completer.setCompletionMode(QtGui.QCompleter.PopupCompletion)
completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.completer = completer
self.completer.insertText.connect(self.insertCompletion)

def insertCompletion(self, completion):
tc = self.textCursor()
extra = (len(completion) -
len(self.completer.completionPrefix()))
tc.movePosition(QtGui.QTextCursor.Left)
tc.movePosition(QtGui.QTextCursor.EndOfWord)
tc.insertText(completion[-extra:])
self.setTextCursor(tc)

def textUnderCursor(self):
tc = self.textCursor()
tc.select(QtGui.QTextCursor.WordUnderCursor)
return tc.selectedText()

def focusInEvent(self, event):
if self.completer:
self.completer.setWidget(self);
QtGui.QTextEdit.focusInEvent(self, event)

def keyPressEvent(self, event):
if self.completer and self.completer.popup() and self.completer.popup().isVisible():
if event.key() in (
QtCore.Qt.Key_Enter,
QtCore.Qt.Key_Return,
QtCore.Qt.Key_Escape,
QtCore.Qt.Key_Tab,
QtCore.Qt.Key_Backtab):
event.ignore()
return
## has ctrl-Space been pressed??
isShortcut = (event.modifiers() == QtCore.Qt.ControlModifier and\
event.key() == QtCore.Qt.Key_Space)
## modifier to complete suggestion inline ctrl-e
inline = (event.modifiers() == QtCore.Qt.ControlModifier and \
event.key() == QtCore.Qt.Key_E)
## if inline completion has been chosen
if inline:
# set completion mode as inline
self.completer.setCompletionMode(QtGui.QCompleter.InlineCompletion)
completionPrefix = self.textUnderCursor()
if (completionPrefix != self.completer.completionPrefix()):
self.completer.setCompletionPrefix(completionPrefix)
self.completer.complete()

# set the current suggestion in the text box
self.completer.insertText.emit(self.completer.currentCompletion())
# reset the completion mode
self.completer.setCompletionMode(QtGui.QCompleter.PopupCompletion)
return
if (not self.completer or not isShortcut):
pass
QtGui.QTextEdit.keyPressEvent(self, event)

ctrlOrShift = event.modifiers() in (QtCore.Qt.ControlModifier ,\
QtCore.Qt.ShiftModifier)
if ctrlOrShift and event.text()== '':
return
eow = "~!@#$%^&*+{}|:\"<>?,./;'[]\\-=" #end of word

hasModifier = ((event.modifiers() != QtCore.Qt.NoModifier) and\
not ctrlOrShift)

completionPrefix = self.textUnderCursor()

if not isShortcut :
if self.completer.popup():
self.completer.popup().hide()
return

self.completer.setCompletionPrefix(completionPrefix)
popup = self.completer.popup()
popup.setCurrentIndex(
self.completer.completionModel().index(0,0))
cr = self.cursorRect()
cr.setWidth(self.completer.popup().sizeHintForColumn(0)
+ self.completer.popup().verticalScrollBar().sizeHint().width())
self.completer.complete(cr) ## popup it up!




class MyDictionaryCompleter(QtGui.QCompleter):
insertText = QtCore.pyqtSignal(str)

def __init__(self, myKeywords=None,parent=None):

myKeywords =['apple','aggresive','ball','bat','cat','cycle','dog','dumb',\
'elephant','engineer','food','file','good','great',\
'hippopotamus','hyper','india','ireland','just','just',\
'key','kid','lemon','lead','mute','magic',\
'news','newyork','orange','oval','parrot','patriot',\
'question','queue','right','rest','smile','simple',\
'tree','urban','very','wood','xylophone','yellow',\
'zebra']
QtGui.QCompleter.__init__(self, myKeywords, parent)
self.connect(self,
QtCore.SIGNAL("activated(const QString&)"), self.changeCompletion)

def changeCompletion(self, completion):
if completion.find("(") != -1:
completion = completion[:completion.find("(")]
print(completion)
self.insertText.emit(completion)

if __name__ == "__main__":

app = QtGui.QApplication([])
completer = MyDictionaryCompleter()
te = MyTextEdit()
te.setCompleter(completer)
te.show()
app.exec_()

最佳答案

主要变化如下:

  • 您必须使用新语法,将 self.connect(self, QtCore.SIGNAL("activated(const QString&)"), self.changeCompletion) 更改为 self. activate.connect(self.changeCompletion).

  • QCompleter 和 QTextEdit 是 QtWidgets 子模块的一部分。

from PyQt5 import QtCore, QtGui, QtWidgets


class MyTextEdit(QtWidgets.QTextEdit):
def __init__(self, parent=None):
super(MyTextEdit, self).__init__(parent)
font = QtGui.QFont()
font.setPointSize(12)
self.setFont(font)
self.completer = None

def setCompleter(self, completer):
if self.completer:
self.disconnect(self.completer, 0, self, 0)
if not completer:
return

completer.setWidget(self)
completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.completer = completer
self.completer.insertText.connect(self.insertCompletion)

def insertCompletion(self, completion):
tc = self.textCursor()
extra = len(completion) - len(self.completer.completionPrefix())
tc.movePosition(QtGui.QTextCursor.Left)
tc.movePosition(QtGui.QTextCursor.EndOfWord)
tc.insertText(completion[-extra:])
self.setTextCursor(tc)

def textUnderCursor(self):
tc = self.textCursor()
tc.select(QtGui.QTextCursor.WordUnderCursor)
return tc.selectedText()

def focusInEvent(self, event):
if self.completer:
self.completer.setWidget(self)
super(MyTextEdit, self).focusInEvent(event)

def keyPressEvent(self, event):
if (
self.completer
and self.completer.popup()
and self.completer.popup().isVisible()
):
if event.key() in (
QtCore.Qt.Key_Enter,
QtCore.Qt.Key_Return,
QtCore.Qt.Key_Escape,
QtCore.Qt.Key_Tab,
QtCore.Qt.Key_Backtab,
):
event.ignore()
return
## has ctrl-Space been pressed??
isShortcut = (
event.modifiers() == QtCore.Qt.ControlModifier
and event.key() == QtCore.Qt.Key_Space
)
## modifier to complete suggestion inline ctrl-e
inline = (
event.modifiers() == QtCore.Qt.ControlModifier
and event.key() == QtCore.Qt.Key_E
)
## if inline completion has been chosen
if inline:
# set completion mode as inline
self.completer.setCompletionMode(
QtWidgets.QCompleter.InlineCompletion
)
completionPrefix = self.textUnderCursor()
if completionPrefix != self.completer.completionPrefix():
self.completer.setCompletionPrefix(completionPrefix)
self.completer.complete()

# set the current suggestion in the text box
self.completer.insertText.emit(self.completer.currentCompletion())
# reset the completion mode
self.completer.setCompletionMode(
QtWidgets.QCompleter.PopupCompletion
)
return
if not self.completer or not isShortcut:
pass
super(MyTextEdit, self).keyPressEvent(event)

ctrlOrShift = event.modifiers() in (
QtCore.Qt.ControlModifier,
QtCore.Qt.ShiftModifier,
)
if ctrlOrShift and event.text() == "":
return
eow = "~!@#$%^&*+{}|:\"<>?,./;'[]\\-=" # end of word

hasModifier = (
event.modifiers() != QtCore.Qt.NoModifier
) and not ctrlOrShift

completionPrefix = self.textUnderCursor()

if not isShortcut:
if self.completer.popup():
self.completer.popup().hide()
return

self.completer.setCompletionPrefix(completionPrefix)
popup = self.completer.popup()
popup.setCurrentIndex(self.completer.completionModel().index(0, 0))
cr = self.cursorRect()
cr.setWidth(
self.completer.popup().sizeHintForColumn(0)
+ self.completer.popup().verticalScrollBar().sizeHint().width()
)
self.completer.complete(cr) ## popup it up!


class MyDictionaryCompleter(QtWidgets.QCompleter):
insertText = QtCore.pyqtSignal(str)

def __init__(self, parent=None):

myKeywords =['apple','aggresive','ball','bat','cat','cycle','dog','dumb',\
'elephant','engineer','food','file','good','great',\
'hippopotamus','hyper','india','ireland','just','just',\
'key','kid','lemon','lead','mute','magic',\
'news','newyork','orange','oval','parrot','patriot',\
'question','queue','right','rest','smile','simple',\
'tree','urban','very','wood','xylophone','yellow',\
'zebra']
super(MyDictionaryCompleter, self).__init__(myKeywords, parent)
self.activated.connect(self.changeCompletion)

@QtCore.pyqtSlot(str)
def changeCompletion(self, completion):
print(completion)
if completion.find("(") != -1:
completion = completion[: completion.find("(")]
print(completion)
self.insertText.emit(completion)


if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)
completer = MyDictionaryCompleter()
te = MyTextEdit()
te.setCompleter(completer)
te.show()
sys.exit(app.exec_())

关于python - PyQt5 中的信号和槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56644976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com