在 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) # <---
# ...
我正在尝试使用 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) # <---
# ...