0

我想在 pyqt5 中旋转一个小部件,我已经开发了这段代码,但它不起作用。角度不会更新,它会返回 False。有谁知道如何更新这个角度以使小部件旋转?如果有人可以提供帮助,谢谢。

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

import sys

robotx=200
roboty=100

class MainWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("My Awesome Rotating Widget")
        self.setGeometry(0, 0, 640, 480)

        self.R=Robot()

        self.angle=0

        self.AngleLineEdit=QLineEdit(self)
        self.AngleLineEdit.setGeometry(50,50,160,35)
        self.AngleLineEdit.setStyleSheet("background-color: rgba(50,50,50,20); color:black; font-weight: bold; font-size: 8pt; font-family: Helvetica; border-radius:5px;")

        self.AcceptButton=QPushButton(self)
        self.AcceptButton.setText("Accept")
        self.AcceptButton.setGeometry(50,100,160,35)
        self.AcceptButton.setStyleSheet("QPushButton{color:black; font-weight: bold; font-size: 8pt; font-family: Helvetica; background-color:rgb(255,255,255,20); border-radius:5px}""QPushButton:hover{background-color : rgb(255,255,255,100);}")

        container = RotatableContainer(self,self.R, 0)
        container.move(robotx,roboty)
        container.resize(150,150)
        container.setStyleSheet("background-color:transparent;")

        self.AcceptButton.clicked.connect(lambda: self.RotateWidget())
        self.AcceptButton.clicked.connect(container.rotate)

        self.show()

    def RotateWidget(self):

        self.angle=int(self.AngleLineEdit.text())
        print(self.angle)


class RotatableContainer(QGraphicsView):

    def __init__(self, parent, widget, angle):

        super().__init__(parent)

        scene = QGraphicsScene(self)
        self.setScene(scene)

        self.proxy = QGraphicsProxyWidget()
        self.proxy.setWidget(widget)
        self.proxy.setTransformOriginPoint(self.proxy.boundingRect().center())
        self.proxy.setRotation(angle)
        scene.addItem(self.proxy)

    def rotate(self, angle):

        print(angle)

        self.proxy.setRotation(angle)



class Robot(QWidget):
    
    def __init__(self):

        super().__init__()
        self.setGeometry(0,0,100,100)        

    def paintEvent(self, event):

        p=QPainter(self)
        r=QRect(0,0,99,99)
        c=QColor(0,0,0)
        p.setBrush(QBrush(c))
        p.drawRect(r)


app = QApplication([])
window = MainWindow()
app.exec_()

我已经看到了一个如何使用 qslider 旋转小部件的示例,但我不知道如何使用 QLineEdit 和 QPushButton 来调整它。

4

1 回答 1

0

的第一个参数clicked始终是其检查状态,默认情况下False用于不可检查/已检查按钮。

由于您已将信号连接到rotate函数,因此参数是按钮信号的参数,并且由于False也意味着0,您实际上正在做self.proxy.setRotation(0).

将容器设置为实例属性并rotate从那里调用其函数:

class MainWindow(QMainWindow):

    def __init__(self):
        # ...
        self.container = RotatableContainer(self,self.R, 0)
        self.container.move(robotx,roboty)
        self.container.resize(150,150)
        self.container.setStyleSheet("background-color:transparent;")

        self.AcceptButton.clicked.connect(self.RotateWidget)

        self.show()

    def RotateWidget(self):

        angle = self.AngleLineEdit.text()
        if angle.isdigit():
            self.angle = angle

        self.container.rotate(self.angle)

注意:您应该始终使用布局管理器,并且只有类和常量应该具有大写名称(请参阅Python 代码样式指南)。

于 2022-02-03T11:58:10.930 回答