#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. Если вы хотите сохранить круги в фиксированном положении, вам нужно сначала нарисовать круги, прежде чем поворачивать художник, т. Е. Переместить линию
painter.rotate(elapsed * 0.35)
после цикла forpaint
.2. Я не имею в виду, как вы сказали. Я не хочу фиксировать позицию. Я имею в виду, что круги могут перемещаться по линии сканирования, как на экране радара. Пожалуйста, посоветуйте мне.
3. Итак, вы хотите, чтобы круги «оставались на своем месте» (ваши слова), но вы также хотите перемещать круги? Честно говоря, это немного сбивает с толку. Может быть, вы можете опубликовать макет того, что вы на самом деле хотите.
4. Спасибо за вашу доброту. Я объясню еще раз. Мне нужен простой экран радара. Я хочу нарисовать объекты обнаружения в виде маленьких зеленых кружков на этом экране. Объекты будут перемещены, когда линия сканирования попадет на них. Проблема моего кода в том, что объекты вращаются вдоль линии сканирования. Результат приведенного выше кода здесь i.stack.imgur.com/Gv1co.gif .
5. Как их следует перемещать, когда строка попадает на них? Должны ли они придерживаться линии? Что-то еще?