【问题标题】:How can I pass my data between my classes on PyQt5?如何在 PyQt5 上的类之间传递我的数据?
【发布时间】:2022-01-20 23:36:59
【问题描述】:

我用 qframe 类制作了一个操纵杆,并且我将鼠标位置数据转换为 -1,1,但是当我尝试使用 pyqt 信号将此位置数据发送到我的主窗口类时,它会给出错误“pyqt 信号没有属性发射” ' 像这样,我去 pyqtSignal 课 here it is 它确实没有发射功能,但是网上有很多这样的例子,我的 pyqt 文件是坏了还是什么,还是因为没有 QObject 类?如何将我的数据传递给其他班级?

这是我的操纵杆类;

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

from PyQt5.QtCore import  QPointF, QTimer,  Qt ,pyqtSignal
from PyQt5.QtGui import  QPainter, QPen
from PyQt5.QtWidgets import QFrame, QApplication, QLabel
import sys
import rospy
from sensor_msgs.msg import Joy

class clock(QFrame):
    def __init__(self):
        super(clock,self).__init__()
        self.setMinimumSize(300,300)
        self.setMaximumSize(300,300)
        self.x=self.width()/2
        self.y=self.height()/2
        self.relative_x=0
        self.relative_y=0
        self.signal=pyqtSignal(int)
    
    def sub(self):
        self.node=rospy.init_node("hanınamk",anonymous=True)
        rospy.Subscriber('/joy',Joy,self.joyControl)

    def joyControl(self,data):
        self.data=data.axes
        self.x=(-(self.data[0]*150)+150)
        self.y=(-(self.data[1]*150)+150)
        print(self.data[0],self.data[1])
        self.repaint()

    def paintEvent(self,event):
    
        pen=QPen()
        pen.setWidth(5)
        pen.setBrush(Qt.black)
        painter=QPainter(self)
        painter.setPen(pen)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.drawEllipse(self.rect())
        
        painter_2=QPainter(self)
        painter_2.setBrush(Qt.black)
        painter_2.setRenderHint(QPainter.Antialiasing)
        painter_2.drawEllipse(QPointF(self.x,self.y),50,50)

    
    def mouseMoveEvent(self,e):
        self.relative_x=(e.x()-150)/150.0
        self.relative_y=(e.y()-150)/150.0  
        # print(round(self.relative_x,1),round(self.relative_y,1))
        self.signal.emit(self.relative_x)
        if self.relative_x**2+self.relative_y**2<1: 
            self.x=e.x()
            self.y=e.y()
            self.repaint()
    
    def mousePressEvent(self,e):
        if self.relative_x**2+self.relative_y**2<1:  
            self.x=e.x()
            self.y=e.y()
            self.repaint()

    def mousePressEvent(self,e):
        if self.relative_x**2+self.relative_y**2<1: 
            self.x=e.x()
            self.y=e.y()
            self.repaint()

    
    def mouseReleaseEvent(self,e):
        self.x=self.width()/2
        self.y=self.height()/2
        self.repaint()
    


if __name__=="__main__":
    app=QApplication(sys.argv)
    win=clock()
    win.show()
    sys.exit(app.exec_())

还有我的主班;

from PyQt5.QtCore import QRect, pyqtSignal, pyqtSlot 
from PyQt5.QtGui import QMouseEvent
from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget
import sys
from joystick import clock

class Main(QWidget):
    def __init__(self):
        super(Main,self).__init__()
        self.setWindowTitle('Main')
        self.setMinimumSize(900,900)
        self.setMaximumSize(900,900)
        layout=QHBoxLayout()
        layout.setGeometry(QRect(200,200,300,300))
        self.joy=clock()
        self.joy_2=clock()
        self.setLayout(layout)
        layout.addWidget(self.joy)
        layout.addWidget(self.joy_2)
        self.label=QLabel(self)
    
    @pyqtSlot(int)
    def on_change(self,data):
        print(data)




if __name__=="__main__":
    app=QApplication(sys.argv)
    win=Main()
    win.show()
    sys.exit(app.exec_()) 

【问题讨论】:

  • 使信号成为类属性。您还需要将信号连接到您的插槽。
  • 你能用一些简短的代码详细解释一下吗?
  • @montana57 请参阅:riverbankcomputing.com/static/Docs/PyQt5/signals_slots.html 注意:不要使用 sip 文件作为参考,它们不是 python 脚本,不打算用作文档或实现的基础。跨度>

标签: python pyqt5 signals-slots


【解决方案1】:

使信号成为类属性而不是实例属性:

class clock(QFrame):
    signal = pyqtSignal(int)
    def __init__(self):
        # ...

并连接到Main.__init__:

self.joy.signal.connect(self.on_change)
self.joy2.signal.connect(self.on_change)

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多