【发布时间】: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