Python:从Qt Designer

时间:2016-11-07 19:02:56

标签: python qt pyqt keypress qplaintextedit

我需要从Qt Designer创建的表单中读取键入QPlainTextWidget的键击。

我知道我可以使用QPlainTextWidget.toPlainText()阅读整个结果文本,但我需要在输入时单独阅读这些字母。 (我正在为摄影师编写文件重命名程序,并希望向用户显示他们在文本框中输入所产生的新文件名。我使用他们的条目作为文件名的基本名称。)< / p>

我尝试使用self.txtFilename.keyPressDown.connect(self.DiplayNewFilename)将子例程连接到文本框,但这会产生错误,因为keyPressDown不是插槽。

我已经在线阅读了子类化可以创建解决方案,但我不知道如何做到这一点,或者将子类化代码放在我的整体代码中。我的程序是一个单一形式的应用程序,它使用我在Qt Designer中创建的GUI表单。我想创建一个灵活的解决方案,让我在主Python文件中添加编码解决方案,而不是编辑Qt Designer生成的GUI代码。

我当前的代码只有一个类(主窗口)。我会在哪里放置新的子类代码 - 在这个现有的类中,还是作为一个新类?我怎么称呼它?

我正在运行Ubuntu 16.04,Python 3和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() 

1 个答案:

答案 0 :(得分:2)

我认为你在考虑这个问题太多:) .. 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不是其事件的信号..请阅读文档以获取更多提示