[英]How to transfer a signal, which detects if the button is clicked or not?
I would like ask if it is possible to use Signal/Slot to transfer the information like: "is this button clicked?"我想问一下是否可以使用Signal/Slot来传输信息,例如:“这个按钮被点击了吗?”
I prepared here some codes....我在这里准备了一些代码....
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Worker(QObject):
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
@pyqtSlot(str, str, int, add_one_more_signal)
def onJob(self, strA, strB, int1, add_one_more_signal):
print(strA, strB, int1)
# if the signal detects the btn1 was clicked:
# print("button 1 is clicked; button 2 is not clicked")
# if the signal detects the btn2 was clicked:
# print("button 1 is not clicked; button 2 is clicked")
class MyApp(QWidget):
signal = pyqtSignal(str, str, int, add_one_more_signal)
def __init__(self, parent= None):
super(MyApp, self).__init__(parent)
self.initUI()
def initUI(self):
self.btn1 = QPushButton("start 1", self)
self.btn2 = QPushButton("start 2", self)
self.btn1.clicked.connect(self.start)
self.btn2.clicked.connect(self.start)
self.layout = QVBoxLayout()
self.layout.addWidget(self.btn1)
self.layout.addWidget(self.btn2)
self.setLayout(self.layout)
self.show()
def start(self):
otherClass = Worker()
self.signal.connect(otherClass.onJob)
self.signal.emit("foo", "baz", 10, self.btn1.clicked(True) or self.btn2.clicked(True)) # How to write this line?
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
Please dont understand me wrong.请不要理解我的错误。 I know with my very rare knowledge how to achieve the programm purpose.
我以我非常罕见的知识知道如何实现程序目的。 I just want to know, how to transfer the Signal, which detects if the button is clicked or not.
我只想知道,如何传输信号,它检测按钮是否被点击。 --To be honest, I also want to know the capability of Signal+Slot.
--说实话,我也想知道Signal+Slot的能力。
In my code there are two buttons.在我的代码中有两个按钮。 They share the same sub-function.
它们共享相同的子功能。 (As I mentioned, just for this question.) When one of them is clicked, three parameters are transferred from MyApp-Class to Worker-Class.
(正如我提到的,仅针对这个问题。)单击其中一个时,三个参数从 MyApp-Class 传输到 Worker-Class。
Now I want to introduce a fourth parameter, which I also wrote in the code above.现在我要介绍第四个参数,我也在上面的代码中写过。 This fourth parameter does only one job, which is, to send the information, whether the button is clicked or not.
第四个参数只做一项工作,即发送信息,无论按钮是否被点击。
So my question is: If it is doable, how to write the code?所以我的问题是:如果可行,如何编写代码?
A possible solution is to send the text that shows the button and for this the fourth parameter must be of type str
, to obtain the object that emitted the signal we use sender()
, in this case sender()
will be the object that was pressed, then We get the text and we send it.一个可能的解决方案是发送显示按钮的文本,为此,第四个参数必须是
str
类型,以获取发出信号的对象,我们使用sender()
,在这种情况下sender()
将是被sender()
的对象按下,然后我们得到文本并发送它。
class Worker(QObject):
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
@pyqtSlot(str, str, int, str)
def onJob(self, strA, strB, int1, text):
print(strA, strB, int1)
if text == "start 1":
print("button 1 is clicked")
elif text == "start 2":
print("button 2 is clicked")
class MyApp(QWidget):
signal = pyqtSignal(str, str, int, str)
def __init__(self, parent= None):
super(MyApp, self).__init__(parent)
self.initUI()
def initUI(self):
self.btn1 = QPushButton("start 1", self)
self.btn2 = QPushButton("start 2", self)
self.btn1.clicked.connect(self.start)
self.btn2.clicked.connect(self.start)
self.layout = QVBoxLayout()
self.layout.addWidget(self.btn1)
self.layout.addWidget(self.btn2)
self.setLayout(self.layout)
self.show()
def start(self):
otherClass = Worker()
btn = self.sender()
self.signal.connect(otherClass.onJob)
self.signal.emit("foo", "baz", 10, btn.text())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.