英文:
What will be the correct angle to get the correct shape in clockwise direction
问题
以下是您提供的代码的翻译部分:
from PyQt5.QtCore import (QByteArray,QDataStream, QIODevice,pyqtSlot, QMimeData, QPointF, QPoint, Qt, QRect,QTimer,QLineF, QEvent,QRectF)
from PyQt5.QtGui import QColor,QDrag, QPainter, QPixmap,QFont,QFontMetrics,QBrush, QLinearGradient, QIcon, QPen, QPainterPath, QTransform,QCursor,QMouseEvent,QClipboard
from PyQt5.QtWidgets import QApplication,QGraphicsTextItem,QStyleOptionGraphicsItem,QStyle,QGraphicsItemGroup,QErrorMessage, QSizePolicy,QShortcut, QScrollArea, QPushButton,QLineEdit, QMainWindow,QInputDialog, QGraphicsPathItem,QDialog, QVBoxLayout,QGraphicsItem,QStatusBar,QTextEdit, QAction,QMenu, qApp,QSplitter, QButtonGroup, QToolButton, QFrame, QHBoxLayout, QGraphicsView, QGraphicsItem, QGraphicsPixmapItem, QLabel, QGraphicsScene, QWidget
import importlib
class GraphicsSceneClass(QGraphicsScene):
global selectedObjType
def __init__(self, parent=None):
super(GraphicsSceneClass, self).__init__(parent)
self.gridOn = 0
self.setSceneRect(0, 0, 1920, 1080)
self.setItemIndexMethod(QGraphicsScene.NoIndex)
self.setBackgroundBrush(QBrush(Qt.black))
def mousePressEvent(self, event):
sampleTransform = QTransform()
objectAtMouse = self.itemAt(event.scenePos(), sampleTransform)
if objectAtMouse and event.button()== Qt.LeftButton:
objectAtMouse.setSelected(True)
pass
elif objectAtMouse==None and event.button()==Qt.RightButton:
self.grid = self.TargPosForLine(event.scenePos(), "ForLine")
self.grid = self.TargPosForLine(event.scenePos(), "ForLine")
opt=QStyleOptionGraphicsItem()
opt.State=QStyle.State_None
painter=QPainter()
painter.setPen(Qt.NoPen)
painter.setBrush(Qt.green)
painter.drawRect(self.grid.x(),self.grid.y(),16,16)
def TargPosForLine(self, position, mode):
clicked_column = int((position.y() // 16)) * 16
clicked_row = int((position.x() // 16)) * 16
if clicked_column < 0:
clicked_column = 0
if clicked_row < 0:
clicked_row = 0
if(mode == "ForRect"):
return QRect(clicked_row, clicked_column,16,16)
elif(mode == "ForLine"):
return QPointF(clicked_row,clicked_column)
def mouseReleaseEvent(self, event):
pass
class MainWindow(QMainWindow):
global selectedObjType
def __init__(self,):
super(MainWindow, self).__init__()
self.createToolbars()
self.scene = GraphicsSceneClass()
MainWindow.obj = self.scene
self.view = QGraphicsView(self.scene)
self.view.setMouseTracking(True)
self.view.setRenderHint(QPainter.HighQualityAntialiasing)
self.widg = QWidget()
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.addWidget(self.view)
self.widg.setMouseTracking(True)
self.widget = QWidget()
self.widget.setLayout(self.horizontalLayout)
self.setCentralWidget(self.widget)
self.obj=None
def contextMenuEvent(self, event):
contextMenu = QMenu(self)
Cutaction = contextMenu.addAction("Cut")
Coaction = contextMenu.addAction("Copy")
Paaction = contextMenu.addAction("Paste")
Propaction = contextMenu.addAction("draw1")
Propaction1=contextMenu.addAction("draw2")
quitAct = contextMenu.addAction("quit")
action = contextMenu.exec_(self.mapToGlobal(event.pos()))
if action == quitAct:
self.close()
elif action == Propaction:
objectDrop = QGraphicsPathItem()
painterPath = QPainterPath()
painterPath.moveTo(10, 6)
painterPath.lineTo(10 + 44.3479, 6)
painterPath.arcTo(10 + 44.3479 - 6, 6 - 4, 4, 4, 270, 90)
painterPath.lineTo(10 + 44.3479 - 2, 6 - 4)
painterPath.arcTo(10 + 44.3479 - 6, 6 - 6, 4, 4, 0, 90)
painterPath.lineTo(10, 0)
gradient = QLinearGradient(1, 1, 1, 5)
gradient.setColorAt(0, QColor(Qt.gray))
gradient.setColorAt(0.5, QColor(192, 192, 192, 255))
gradient.setColorAt(1, QColor(Qt.darkGray))
painterPath.closeSubpath()
objectDrop.setPos(self.scene.grid)
objectDrop.setPen(QPen(Qt.NoPen))
objectDrop.setPath(painterPath)
objectDrop.setBrush(QBrush(gradient))
objectDrop._position = QPointF(self.scene.grid)
print("line", self.scene.grid)
objectDrop.setFlag(QGraphicsItem.ItemIsSelectable)
objectDrop.setFlag(QGraphicsItem.ItemIsMovable)
objectDrop._type1 = "line"
self.scene.addItem(objectDrop)
print(objectDrop)
elif action==Propaction1:
objectDrop = QGraphicsPathItem()
painterPath = QPainterPath()
painterPath.moveTo(10, 0)
painterPath.lineTo(10 + 44.3479, 0)
painterPath.arcTo(10 + 44.3479 - 6, 0 - 4, 4, 4, 270, 90)
painterPath.lineTo(10 + 44.3479 - 2, 0 - 4)
painterPath.arcTo(10 + 44.3479 - 6, 0 - 6, 4, 4, 0, 90)
painterPath.lineTo(10, 6)
gradient = QLinearGradient(1, 1, 1, 5)
gradient.setColorAt(0, QColor(Qt.gray))
gradient.setColorAt(0.5, QColor(192, 192, 192, 255))
gradient.setColorAt(1, QColor(Qt.darkGray))
painterPath.closeSubpath()
objectDrop.setPos(self.scene.grid)
objectDrop.setPen(QPen(Qt.NoPen))
objectDrop.setPath(painterPath)
objectDrop.setBrush(QBrush(gradient))
objectDrop._position=QPointF(self.scene.grid)
print("line",self.scene.grid)
objectDrop.setFlag(QGraphicsItem.ItemIsSelectable)
objectDrop.setFlag(QGraphicsItem.ItemIsMovable)
objectDrop._type1 = "line"
self.scene.addItem(objectDrop)
print(objectDrop)
if __name__=="__main__":
import sys
app=QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
请注意,这是您提供的代码的翻译部分,我没有翻译代码中
英文:
from PyQt5.QtCore import (QByteArray,QDataStream, QIODevice,pyqtSlot, QMimeData, QPointF, QPoint, Qt, QRect,QTimer,QLineF, QEvent,QRectF)
from PyQt5.QtGui import QColor,QDrag, QPainter, QPixmap,QFont,QFontMetrics,QBrush, QLinearGradient, QIcon, QPen, QPainterPath, QTransform,QCursor,QMouseEvent,QClipboard
from PyQt5.QtWidgets import QApplication,QGraphicsTextItem,QStyleOptionGraphicsItem,QStyle,QGraphicsItemGroup,QErrorMessage, QSizePolicy,QShortcut, QScrollArea, QPushButton,QLineEdit, QMainWindow,QInputDialog, QGraphicsPathItem,QDialog, QVBoxLayout,QGraphicsItem,QStatusBar,QTextEdit, QAction,QMenu, qApp,QSplitter, QButtonGroup, QToolButton, QFrame, QHBoxLayout, QGraphicsView, QGraphicsItem, QGraphicsPixmapItem, QLabel, QGraphicsScene, QWidget
import importlib
class GraphicsSceneClass(QGraphicsScene):
global selectedObjType
def __init__(self, parent=None):
super(GraphicsSceneClass, self).__init__(parent)
self.gridOn = 0
self.setSceneRect(0, 0, 1920, 1080)
self.setItemIndexMethod(QGraphicsScene.NoIndex)
self.setBackgroundBrush(QBrush(Qt.black))
def mousePressEvent(self, event):
sampleTransform = QTransform()
objectAtMouse = self.itemAt(event.scenePos(), sampleTransform)
if objectAtMouse and event.button()== Qt.LeftButton:
objectAtMouse.setSelected(True)
pass
elif objectAtMouse==None and event.button()==Qt.RightButton:
# pass
self.grid = self.TargPosForLine(event.scenePos(), "ForLine")
self.grid = self.TargPosForLine(event.scenePos(), "ForLine")
opt=QStyleOptionGraphicsItem()
opt.State=QStyle.State_None
painter=QPainter()
painter.setPen(Qt.NoPen)
painter.setBrush(Qt.green)
painter.drawRect(self.grid.x(),self.grid.y(),16,16)
def TargPosForLine(self, position, mode):
clicked_column = int((position.y() // 16)) * 16
clicked_row = int((position.x() // 16)) * 16
if clicked_column < 0:
clicked_column = 0
if clicked_row < 0:
clicked_row = 0
if(mode == "ForRect"):
return QRect(clicked_row, clicked_column,16,16)
elif(mode == "ForLine"):
return QPointF(clicked_row,clicked_column)
def mouseReleaseEvent(self, event):
# self.DeselectItems()
pass
class MainWindow(QMainWindow):
global selectedObjType
# global item
def __init__(self,):
super(MainWindow, self).__init__()
self.createToolbars()
self.scene = GraphicsSceneClass()
MainWindow.obj = self.scene
self.view = QGraphicsView(self.scene)
# self.view.setDragMode(QGraphicsView.RubberBandDrag)
self.view.setMouseTracking(True)
self.view.setRenderHint(QPainter.HighQualityAntialiasing)
self.widg = QWidget()
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.addWidget(self.view)
self.widg.setMouseTracking(True)
self.widget = QWidget()
self.widget.setLayout(self.horizontalLayout)
self.setCentralWidget(self.widget)
self.obj=None
#
def contextMenuEvent(self, event):
contextMenu = QMenu(self)
Cutaction = contextMenu.addAction("Cut")
Coaction = contextMenu.addAction("Copy")
Paaction = contextMenu.addAction("Paste")
Propaction = contextMenu.addAction("draw1")
Propaction1=contextMenu.addAction("draw2")
quitAct = contextMenu.addAction("quit")
action = contextMenu.exec_(self.mapToGlobal(event.pos()))
if action == quitAct:
self.close()
elif action == Propaction:
objectDrop = QGraphicsPathItem()
painterPath = QPainterPath()
painterPath.moveTo(10, 6)
painterPath.lineTo(10 + 44.3479, 6)
painterPath.arcTo(10 + 44.3479 - 6, 6 - 4, 4, 4, 270, 90)
painterPath.lineTo(10 + 44.3479 - 2, 6 - 4)
painterPath.arcTo(10 + 44.3479 - 6, 6 - 6, 4, 4, 0, 90)
painterPath.lineTo(10, 0)
gradient = QLinearGradient(1, 1, 1, 5)
gradient.setColorAt(0, QColor(Qt.gray))
gradient.setColorAt(0.5, QColor(192, 192, 192, 255))
gradient.setColorAt(1, QColor(Qt.darkGray))
painterPath.closeSubpath()
objectDrop.setPos(self.scene.grid)
objectDrop.setPen(QPen(Qt.NoPen))
objectDrop.setPath(painterPath)
objectDrop.setBrush(QBrush(gradient))
objectDrop._position = QPointF(self.scene.grid)
print("line", self.scene.grid)
objectDrop.setFlag(QGraphicsItem.ItemIsSelectable)
objectDrop.setFlag(QGraphicsItem.ItemIsMovable)
objectDrop._type1 = "line"
self.scene.addItem(objectDrop)
print(objectDrop)
elif action==Propaction1:
objectDrop = QGraphicsPathItem()
painterPath = QPainterPath()
painterPath.moveTo(10, 0)
painterPath.lineTo(10 + 44.3479, 0)
painterPath.arcTo(10 + 44.3479 - 6, 0 - 4, 4, 4, 270, 90)
painterPath.lineTo(10 + 44.3479 - 2, 0 - 4)
painterPath.arcTo(10 + 44.3479 - 6, 0 - 6, 4, 4, 0, 90)
painterPath.lineTo(10, 6)
gradient = QLinearGradient(1, 1, 1, 5)
gradient.setColorAt(0, QColor(Qt.gray))
gradient.setColorAt(0.5, QColor(192, 192, 192, 255))
gradient.setColorAt(1, QColor(Qt.darkGray))
painterPath.closeSubpath()
objectDrop.setPos(self.scene.grid)
objectDrop.setPen(QPen(Qt.NoPen))
objectDrop.setPath(painterPath)
objectDrop.setBrush(QBrush(gradient))
objectDrop._position=QPointF(self.scene.grid)
print("line",self.scene.grid)
objectDrop.setFlag(QGraphicsItem.ItemIsSelectable)
objectDrop.setFlag(QGraphicsItem.ItemIsMovable)
objectDrop._type1 = "line"
self.scene.addItem(objectDrop)
print(objectDrop)
if __name__=="__main__":
import sys
app=QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
I need help in arcTo function of Qpainterpath.I have added the images of the painterpath code which i have mentioned here.
In first image i have drawn the pathitem in counter clockwise direction.
In second image I have drawn the pathitem in clockwise direction and it looks like twisted one.
I have tried by changing the angle mentioned in arcTo with negative sign.But it is not giving the perfect item like in first image.
What will be the correct angle to get the correct shape in clockwise direction
答案1
得分: 0
你可以尝试类似以下的方式。我已添加注释以指示项目2中的元素与项目1中的元素相关联。
项目1:
painterPath.moveTo(10, 6)
# 线1
painterPath.lineTo(10 + 44.3479, 6)
# 弧1逆时针
painterPath.arcTo(10 + 44.3479 - 6, 6 - 4, 4, 4, 270, 90)
# 线2
painterPath.lineTo(10 + 44.3479 - 2, 6 - 4)
# 弧2逆时针
painterPath.arcTo(10 + 44.3479 - 6, 6 - 6, 4, 4, 0, 90)
# 线3
painterPath.lineTo(10, 0)
项目2:
painterPath.moveTo(10, 0)
# 线3
painterPath.lineTo(10 + 44.3479, 0)
# 弧2顺时针
painterPath.arcTo(10 + 44.3479 - 6, 6 - 6, 4, 4, 90, -90)
# 线2
painterPath.lineTo(10 + 44.3479 - 2, 6 - 4)
# 弧1顺时针
painterPath.arcTo(10 + 44.3479 - 6, 6 - 4, 4, 4, 360, -90)
# 线1
painterPath.lineTo(10, 6)
英文:
You could try something like this. I've added comments to indicate how the elements in item 2 relate to those in item 1.
Item 1:
painterPath.moveTo(10, 6)
# line 1
painterPath.lineTo(10 + 44.3479, 6)
# arc 1 counter clockwise
painterPath.arcTo(10 + 44.3479 - 6, 6 - 4, 4, 4, 270, 90)
# line 2
painterPath.lineTo(10 + 44.3479 - 2, 6 - 4)
# arc 2 counter clockwise
painterPath.arcTo(10 + 44.3479 - 6, 6 - 6, 4, 4, 0, 90)
# line 3
painterPath.lineTo(10, 0)
Item 2:
painterPath.moveTo(10, 0)
# line 3
painterPath.lineTo(10 + 44.3479, 0)
# arc 2 clockwise
painterPath.arcTo(10 + 44.3479 - 6, 6 - 6, 4, 4, 90, -90)
# line 2
painterPath.lineTo(10 + 44.3479 - 2, 6 - 4)
# arc 1 clockwise
painterPath.arcTo(10 + 44.3479 - 6, 6 - 4, 4, 4, 360, -90)
# line 1
painterPath.lineTo(10, 6)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论