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