第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何正確編寫PyQT5事件函數(shù)

如何正確編寫PyQT5事件函數(shù)

滄海一幻覺 2023-08-15 17:26:25
如何正確編寫事件函數(shù),通過按 Enter 鍵從一個(gè) QLineEdit 傳遞到另一個(gè) QLineEdit?我知道如何以這種方式做到這一點(diǎn):工作示例import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QFormLayoutfrom PyQt5.QtCore import Qt, QEventclass working(QWidget):    def __init__(self):        super().__init__()        self.initUI()    def initUI(self):        self.show()        self.x = QLineEdit(self)        self.x1 = QLineEdit(self)        layout = QFormLayout(self)        layout.addRow("x:", self.x)        layout.addRow("x1:", self.x1)    def event(self, event):        if event.type() == QEvent.KeyPress:            if event.key() in (Qt.Key_Return, Qt.Key_Enter):                self.focusNextPrevChild(True)        return super().event(event)def main():    app = QApplication(sys.argv)    ex = working()    sys.exit(app.exec_())if __name__ == '__main__':    main()現(xiàn)在我想了解如何對(duì)這段代碼執(zhí)行相同的操作(我認(rèn)為問題出在 super() 和init上,但我不知道為什么)。無法工作的基本示例from PyQt5 import QtCore, QtWidgets, QtGui class Ui_MainWindow(object):    def setupUi(self, MainWindow):        MainWindow.setObjectName("MainWindow")        MainWindow.resize(193, 119)        self.centralwidget = QtWidgets.QWidget(MainWindow)        self.centralwidget.setObjectName("centralwidget")        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)        self.verticalLayout_2.setObjectName("verticalLayout_2")         self.x = QtWidgets.QLineEdit()        self.verticalLayout_2.addWidget(self.x)        self.x1 = QtWidgets.QLineEdit()        self.verticalLayout_2.addWidget(self.x1)         MainWindow.setCentralWidget(self.centralwidget)        self.statusbar = QtWidgets.QStatusBar(MainWindow)        self.statusbar.setObjectName("statusbar")        MainWindow.setStatusBar(self.statusbar)        self.retranslateUi(MainWindow)        QtCore.QMetaObject.connectSlotsByName(MainWindow)     def retranslateUi(self, MainWindow):        _translate = QtCore.QCoreApplication.translate        MainWindow.setWindowTitle(_translate("MainWindow", "0")) 
查看完整描述

1 回答

?
楊__羊羊

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊

第二個(gè)示例不起作用,因?yàn)槟噲D重寫該event方法,該方法僅適用于 QWidget 子類,而您Ui_MainWindow是一個(gè)簡(jiǎn)單的 pythonobject子類,因此永遠(yuǎn)不會(huì)調(diào)用它。


該event()方法由 Qt 在任何 QWidget 上調(diào)用,并且由于您在第一個(gè)示例中重寫了它,因此實(shí)際上調(diào)用了您的方法。在第二個(gè)示例中,您沒有重寫 QWidget event,但您只是創(chuàng)建了一個(gè)永遠(yuǎn)不會(huì)被任何東西調(diào)用的函數(shù)。


理論上,您可以覆蓋對(duì)象event的方法(這就是所謂的“猴子修補(bǔ)”):MainWindowsetupUi


    def setupUi(self, MainWindow):

        # ...

        MainWindow.event = self.event

但這是行不通的,因?yàn)閟elf您在該函數(shù)中引用的實(shí)際上是實(shí)例Ui_MainWindow,而不是實(shí)際的 QMainWindow 實(shí)例。雖然您可以使用 lambda,并使用 MainWindow 實(shí)例添加參數(shù),但我強(qiáng)烈建議您不要這樣做,下面的解釋將闡明為什么您不應(yīng)該這樣做。



出于簡(jiǎn)單的原因,做您想要實(shí)現(xiàn)的目標(biāo)是沒有意義的:修改或嘗試模仿“pyuic”生成的文件的行為是**永遠(yuǎn)**不應(yīng)該做的事情。

不鼓勵(lì)編輯主要是因?yàn)槊慨?dāng)您需要從設(shè)計(jì)器更改 UI 中的某些內(nèi)容時(shí),您最終都會(huì)嘗試將新生成的代碼(希望您同時(shí)沒有覆蓋該文件)與現(xiàn)有代碼集成,這將導(dǎo)致通常會(huì)導(dǎo)致大量錯(cuò)誤、問題、崩潰和頭痛。


不鼓勵(lì)編輯或模仿,因?yàn)檫@使得實(shí)現(xiàn)簡(jiǎn)單的類操作或覆蓋現(xiàn)有方法變得非常困難。另外,雖然我可以理解您有興趣研究它是如何工作的,但除了閱讀如何在 中創(chuàng)建界面之外setupUi,沒有什么可以學(xué)習(xí)的了。pyuic 文件僅用作“實(shí)用層”,以簡(jiǎn)化 PyQt 中的編程,它們應(yīng)始終僅按照有關(guān)使用 Designer 的官方指南中的建議進(jìn)行導(dǎo)入和使用。


如果您想實(shí)現(xiàn)第一個(gè)示例的事件,您需要使用您自己的子類并使用上面鏈接中建議的方法之一。最常見且易于使用的是多重繼承方法:


import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QFormLayout

from PyQt5.QtCore import Qt, QEvent

from ui_mainwindow import Ui_MainWindow


class Working(QMainWindow, Ui_MainWindow):

    def __init__(self):

        super().__init__()

        self.setupUi(self)


    def event(self, event):

        if event.type() == QEvent.KeyPress:

            if event.key() in (Qt.Key_Return, Qt.Key_Enter):

                self.focusNextPrevChild(True)

        return super().event(event)


if __name__ == "__main__":

    import sys

 

    app = QApplication(sys.argv)

    mainWindow = Working()

    mainWindow.show()

    sys.exit(app.exec_())

注意:我假設(shè)您已使用再次生成pyuic了該文件,并且該文件名為ui_mainwindow.py; 另請(qǐng)注意,如果您在設(shè)計(jì)器中使用 QMainWindow,則必須從同一類(QMainWindow,而不是 QWidget)繼承子類;最后,由于您已經(jīng)從 QMainWindow和Ui_MainWindow 進(jìn)行子類化,因此您必須創(chuàng)建 的實(shí)例Working,而不是 QMainWindow 之一,也不是 Ui_MainWindow 之一。


另一種可能性是使用該uic模塊,它允許直接導(dǎo)入.ui文件,而無需每次都重建整個(gè)界面。


import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QFormLayout

from PyQt5.QtCore import Qt, QEvent

from PyQt5.uic import loadUi


class Working(QMainWindow, Ui_MainWindow):

    def __init__(self):

        super().__init__()

        loadUi('mainWindow.ui', self)

        # ...


查看完整回答
反對(duì) 回復(fù) 2023-08-15
  • 1 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)