Как мне остановить маленькие вращающиеся круги вдоль линии сканирования в QPainter?

#python #python-3.x #opengl #pyqt #pyside2

#python #python-3.x #opengl #pyqt #pyside2

Вопрос:

Я пытаюсь повернуть линию по кругу, как секундную стрелку часов. При вращении линии я также хочу рисовать маленькие круги здесь и там внутри круга. Проблема в том, что маленькие круги, которые я нарисовал, вращаются вдоль линии. Я хочу, чтобы эти круги оставались на своем месте и перемещались в соответствии с моим кодом. Кто-нибудь может мне помочь?

 import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtOpenGL import *
from OpenGL import GL


class Helper:
    def __init__(self):
        gradient = QLinearGradient(QPointF(50, -20), QPointF(80, 20))
        gradient.setColorAt(0.0, Qt.green)
        gradient.setColorAt(1.0, Qt.blue)

        self.background = QBrush(QColor(0, 0, 0))
        self.circlePen = QPen(Qt.green)
        self.circlePen.setWidth(2)
        self.textPen = QPen(Qt.green,8,Qt.SolidLine)
        self.textFont = QFont()
        self.textFont.setPixelSize(100)

   def paint(self, painter, event, elapsed):
        painter.fillRect(event.rect(), self.background)

        painter.setPen(self.circlePen)
        painter.translate(400, 400)
        painter.drawEllipse(-250,-250,500,500)
        painter.rotate(elapsed * 0.35)
        painter.setBrush(QColor(Qt.green))
        dx = 100
        dy = 100
        for i in range(10):
           painter.drawEllipse(dx,dy,8,8)
           dx  = 10
           dy  = 10
        painter.save()

        painter.drawLine(0,-250,0,0)

        painter.restore()

class GLWidget(QGLWidget):
   def __init__(self, helper, parent = None):
       QGLWidget.__init__(self, QGLFormat(QGL.SampleBuffers), parent)

       self.helper = helper
       self.elapsed = 0
       self.setFixedSize(800, 800)


   def animate(self):
       self.elapsed = (self.elapsed   self.sender().interval()) % 1000
       self.repaint()

   def paintEvent(self, event):
       painter = QPainter()
       painter.begin(self)
       self.helper.paint(painter, event, self.elapsed)
       painter.end()


class Window(QWidget):
   def __init__(self, parent = None):
       QWidget.__init__(self, parent)

       helper = Helper()
       openGL = GLWidget(helper, self)
       openGLLabel = QLabel(self.tr("OpenGL"))
       openGLLabel.setAlignment(Qt.AlignHCenter)

       layout = QGridLayout()
       layout.addWidget(openGL, 100, 100)
       layout.addWidget(openGLLabel, 1, 0)
       self.setLayout(layout)

       timer = QTimer(self)
       self.connect(timer, SIGNAL("timeout()"), openGL.animate)
       timer.start(1)

       self.setWindowTitle(self.tr("2D Painting on Native and OpenGL Widgets"))


 if __name__ == '__main__':
     app = QApplication(sys.argv)
     window = Window()
     window.show()
     sys.exit(app.exec_())
  

маленькие зеленые круги вращаются вместе с линией

маленькие зеленые круги вращаются вместе с линией

1: Результаты приведенного выше кода

Результат, который я имею

Результат, который я хочу, такой

Комментарии:

1. Если вы хотите сохранить круги в фиксированном положении, вам нужно сначала нарисовать круги, прежде чем поворачивать художник, т. Е. Переместить линию painter.rotate(elapsed * 0.35) после цикла for paint .

2. Я не имею в виду, как вы сказали. Я не хочу фиксировать позицию. Я имею в виду, что круги могут перемещаться по линии сканирования, как на экране радара. Пожалуйста, посоветуйте мне.

3. Итак, вы хотите, чтобы круги «оставались на своем месте» (ваши слова), но вы также хотите перемещать круги? Честно говоря, это немного сбивает с толку. Может быть, вы можете опубликовать макет того, что вы на самом деле хотите.

4. Спасибо за вашу доброту. Я объясню еще раз. Мне нужен простой экран радара. Я хочу нарисовать объекты обнаружения в виде маленьких зеленых кружков на этом экране. Объекты будут перемещены, когда линия сканирования попадет на них. Проблема моего кода в том, что объекты вращаются вдоль линии сканирования. Результат приведенного выше кода здесь i.stack.imgur.com/Gv1co.gif .

5. Как их следует перемещать, когда строка попадает на них? Должны ли они придерживаться линии? Что-то еще?