Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在QMainWindow中创建的一个QObject中的两个小部件之间进行通信_Python_Pyside - Fatal编程技术网

Python 如何在QMainWindow中创建的一个QObject中的两个小部件之间进行通信

Python 如何在QMainWindow中创建的一个QObject中的两个小部件之间进行通信,python,pyside,Python,Pyside,我对Qt中的信号和插槽有问题。假设我有三个类和方法,如下所示(忽略GUI的创建和其他一些事情): 这是代码的简短版本。在main窗口中我有mdiArea,我正在创建一个对象来控制车窗中发生的一切(CarControl),并将其QWidgetTireWind作为子窗口添加到mdiArea。 当我在我的子窗口TireWind中点击按钮清空轮胎时,它应该发出信号清空轮胎,我的“控制器”CarControl应该识别它并运行方法printProblem。但我没有做到。 如何在TireWind和CarCon

我对Qt中的信号和插槽有问题。假设我有三个类和方法,如下所示(忽略GUI的创建和其他一些事情):

这是代码的简短版本。在
main窗口中
我有
mdiArea
,我正在创建一个对象来控制车窗中发生的一切(
CarControl
),并将其QWidget
TireWind
作为子窗口添加到
mdiArea
。 当我在我的子窗口
TireWind
中点击
按钮清空轮胎时,它应该发出信号
清空轮胎
,我的“控制器”
CarControl
应该识别它并运行方法
printProblem
。但我没有做到。 如何在
TireWind
CarControl
之间进行通信? 我在CarControl中有多个QWidget,所以我想在
CarControl中管理其Widget之间的所有内容

希望有足够的代码来理解这个问题:)

编辑: 我输入了一个错误:应该是:
self.tire.empty\u tire.connect(self.printProblem)
而不是
self.tire.sendEmptyTyResignal.connect(self.printProblem)

编辑2: 编辑代码,使其可运行


还是不行!:(

您正在使用以下行将函数连接到插槽:

self.tire.sendEmptyTireSignal.connect(self.printProblem)
应该改为

self.tire.empty_tire.connect(self.printProblem)
因为
empty_tire
是您要将插槽连接到的信号

编辑:

使用新代码时,垃圾收集器正在清理您的CarControl对象。这会导致您的信号断开连接,因为QObject已不存在。您可以通过将其放入列表来解决此问题,例如:

class MainWindow(QDialog):
    cars = []

    def __init__(self, parent=None):
        ...

    def createCar(self):
        car1 = CarControl(self)
        # append it to the list so the object is still referenced
        self.cars.append(car1)
        tireWind = car1.getTireWind()
        self.mdiArea.addSubWindow(tireWind)

        tireWind.show()

我找到了,这是个愚蠢的错误

而不是:

class CarControl(QObject):

def __init__(self, parent=None):
    super(CarControl, self).__init__()
它应该是:

class CarControl(QObject):

def __init__(self, parent=None):
    super(CarControl, self).__init__(parent)
我没有将父对象传递给QObject,所以它可能无法引用任何地方或类似的内容。
是的,就是这样。

打字:将
self.tire.sendEmptyTireSignal.connect(self.printProblem)
更改为
self.tire.empty\u tire.connect(self.printProblem)
确实,我复制错了。但它仍然不起作用:(确实,我复制错了。但它仍然不起作用:(你能提供一个可运行的例子吗?你问题中的代码缺少一些东西,因此我无法告诉你为什么它不工作。或者,如果在整个回溯后出现错误。我编辑了我的代码,它是可运行的。没有任何错误。当我按下“创建汽车控制”按钮时,它会创建窗口“TireWind”在那个窗口内,当你按下“空轮胎”按钮时,它应该显示:“我在”和“空轮胎”,但它不会显示“空轮胎”啊,很好,肯定是一种更优雅的方式来修复它。
class CarControl(QObject):

def __init__(self, parent=None):
    super(CarControl, self).__init__(parent)