在 Python 中的 PyQt5 类 之间调用函数

Calling functions between PyQt5 classes in Python

我正在尝试使用 Python 中的 PyQt5 按钮“dropEvent”事件调用主要 class 中的函数。尽管函数中的“print("setText")”命令有效,但下一个“self.lbl_1.setText("setText")”命令却不起作用。

代码:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Button(QPushButton):
    def __init__(self, title, parent):
        super(Button, self).__init__(title, parent)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat('text/plain'):
            event.accept()
        else:
            event.ignore() 

    def dropEvent(self, event):
        self.setText(event.mimeData().text())
        MainWindow().lbl_setText()


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setGeometry(100, 100, 200, 150)
        self.setWindowTitle("Example")

        self.setup()
    
    def setup(self):
        self.btn_quit = Button('Quit', self)
        self.btn_quit.clicked.connect(QApplication.instance().quit)
        self.btn_quit.resize(self.btn_quit.sizeHint())
        self.btn_quit.move(90, 100)
        self.btn_quit.setAcceptDrops(True)

        self.le_drag = QLineEdit('', self)
        self.le_drag.setDragEnabled(True)
        self.le_drag.move(50, 50)

        self.lbl_1= QLabel('Hi', self)
        self.lbl_1.move(50, 10)

    def closeEvent(self, event: QCloseEvent):
        reply = QMessageBox.question(self, 'Message', "r u sure!",
                                QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
    
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def lbl_setText(self):
        print("setText")
        self.lbl_1.setText("setText")

def main():
    app = QApplication([])
    app.setStyle("Fusion")
    mainWin = MainWindow()
    mainWin.show()
    app.exec()

if __name__ == '__main__':
    main()

交互不发生在 类 之间,而是发生在对象之间,在您的情况下,您正在创建一个不可见的新 MainWindow 对象,因此您遇到了这个问题。 Qt 中对象通信的一种简单方式是通过信号和槽:

class Button(QPushButton):
    dropped = pyqtSignal(str)

    # ....

    def dropEvent(self, event):
        self.setText(event.mimeData().text())
        self.dropped.emit(self.text())

class MainWindow(QMainWindow):
    # ...
    
    def setup(self):
        self.btn_quit = Button('Quit', self)
        self.btn_quit.clicked.connect(QApplication.quit)
        self.btn_quit.resize(self.btn_quit.sizeHint())
        self.btn_quit.move(90, 100)
        self.btn_quit.setAcceptDrops(True)

        self.le_drag = QLineEdit('', self)
        self.le_drag.setDragEnabled(True)
        self.le_drag.move(50, 50)

        self.lbl_1= QLabel('Hi', self)
        self.lbl_1.move(50, 10)

        self.btn_quit.dropped.connect(self.lbl_1.setText) # <---

    # ...