简体   繁体   English

如何传输检测按钮是否被点击的信号?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM