Python: 从 Qt Designer 创建的 QPlainTextWidget 获取击键
Python: Get keystrokes from QPlainTextWidget created by Qt Designer
我需要从 Qt Designer 创建的窗体中读取输入到 QPlainTextWidget 中的击键。
我知道我可以使用 QPlainTextWidget.toPlainText()
阅读整个结果文本,但我需要在输入字母时逐个阅读它们。 (我正在为摄影师编写一个文件重命名程序,并希望向用户显示他们在文本框中输入的新文件名。我使用他们的条目作为文件名的基本名称。)
我尝试使用 self.txtFilename.keyPressDown.connect(self.DiplayNewFilename)
将子例程连接到文本框,但这会产生错误,因为 keyPressDown 不是插槽。
我在网上看到 subclassing 可以创建一个解决方案,但我不知道该怎么做,或者将 subclassing 代码放入我的整体代码。我的程序是一个单窗体应用程序,它使用我在 Qt Designer 中创建的 GUI 窗体。我想创建一个灵活的解决方案,让我可以在主 Python 文件中添加编码解决方案,而不是编辑 Qt Designer 生成的 GUI 代码。
我目前的代码只有一个class(主要是window)。我应该把新的 subclassing 代码放在哪里——在这个现有的 class 中,还是作为一个新的 class?我怎么称呼它?
我是运行Ubuntu16.04,Python3,Qt 4。下面代码中的photoOrg_MainWindow.Ui_MainWindow
是Qt Designer创建的窗体。 txtFilename
是我要捕获其击键的文本小部件。
干杯,非常感谢你的智慧!
TL/DR:有没有办法从 Qt Designer 中创建的文本小部件访问文本框击键?
到目前为止,这是我的代码的本质:
class MainWindow(QtGui.QMainWindow, photoOrg_MainWindow.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)
self.actionOpen_Files.triggered.connect(self.GetPhotoFileNames)
self.txtFilename.keyPressDown.connect(self.DisplayNewFilename) #this doesn't work
more irrelevant routines and connect bindings code here...
def DisplayNewFilename(self):
Code that processes the keystroke to display it as part of a sample new filename displayed in a QLabel
def main():
app = QtGui.QApplication(sys.argv)
form = MainWindow()
form.show()
app.exec_()
if __name__ == '__main__':
main()
我觉得你想太多了:) .. eventFilter 可以帮助你很多。这是一个可以提供一点帮助的小例子
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.setGeometry(300, 300, 250, 150)
vLayout = QtGui.QVBoxLayout(self)
plainTextEdit = QtGui.QPlainTextEdit()
self.newName = QtGui.QLineEdit()
vLayout.addWidget(plainTextEdit)
vLayout.addWidget(self.newName)
plainTextEdit.installEventFilter(self)
self.show()
def eventFilter(self, sourceObj, event):
if event.type() == QtCore.QEvent.KeyPress:
if event.text() == "z":
self.newName.setText("do you mean zoo ?")
return QtGui.QWidget.eventFilter(self, sourceObj, event)
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
并且 keyPressDown 不是其事件的信号。请阅读文档以获取更多提示
我需要从 Qt Designer 创建的窗体中读取输入到 QPlainTextWidget 中的击键。
我知道我可以使用 QPlainTextWidget.toPlainText()
阅读整个结果文本,但我需要在输入字母时逐个阅读它们。 (我正在为摄影师编写一个文件重命名程序,并希望向用户显示他们在文本框中输入的新文件名。我使用他们的条目作为文件名的基本名称。)
我尝试使用 self.txtFilename.keyPressDown.connect(self.DiplayNewFilename)
将子例程连接到文本框,但这会产生错误,因为 keyPressDown 不是插槽。
我在网上看到 subclassing 可以创建一个解决方案,但我不知道该怎么做,或者将 subclassing 代码放入我的整体代码。我的程序是一个单窗体应用程序,它使用我在 Qt Designer 中创建的 GUI 窗体。我想创建一个灵活的解决方案,让我可以在主 Python 文件中添加编码解决方案,而不是编辑 Qt Designer 生成的 GUI 代码。
我目前的代码只有一个class(主要是window)。我应该把新的 subclassing 代码放在哪里——在这个现有的 class 中,还是作为一个新的 class?我怎么称呼它?
我是运行Ubuntu16.04,Python3,Qt 4。下面代码中的photoOrg_MainWindow.Ui_MainWindow
是Qt Designer创建的窗体。 txtFilename
是我要捕获其击键的文本小部件。
干杯,非常感谢你的智慧!
TL/DR:有没有办法从 Qt Designer 中创建的文本小部件访问文本框击键?
到目前为止,这是我的代码的本质:
class MainWindow(QtGui.QMainWindow, photoOrg_MainWindow.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)
self.actionOpen_Files.triggered.connect(self.GetPhotoFileNames)
self.txtFilename.keyPressDown.connect(self.DisplayNewFilename) #this doesn't work
more irrelevant routines and connect bindings code here...
def DisplayNewFilename(self):
Code that processes the keystroke to display it as part of a sample new filename displayed in a QLabel
def main():
app = QtGui.QApplication(sys.argv)
form = MainWindow()
form.show()
app.exec_()
if __name__ == '__main__':
main()
我觉得你想太多了:) .. eventFilter 可以帮助你很多。这是一个可以提供一点帮助的小例子
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.setGeometry(300, 300, 250, 150)
vLayout = QtGui.QVBoxLayout(self)
plainTextEdit = QtGui.QPlainTextEdit()
self.newName = QtGui.QLineEdit()
vLayout.addWidget(plainTextEdit)
vLayout.addWidget(self.newName)
plainTextEdit.installEventFilter(self)
self.show()
def eventFilter(self, sourceObj, event):
if event.type() == QtCore.QEvent.KeyPress:
if event.text() == "z":
self.newName.setText("do you mean zoo ?")
return QtGui.QWidget.eventFilter(self, sourceObj, event)
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
并且 keyPressDown 不是其事件的信号。请阅读文档以获取更多提示