Почему прямоугольник частично за пределами видимого треугольника?

Я использую привязки Python-Qt от PySide, и я хочу нарисовать сцену, среди прочего, прямоугольник, и прямоугольник не полностью виден, потому что в представлении должна отображаться только часть сцены, где прямоугольник не полностью содержится.

Вот минимальный пример:

from PySide.QtGui import *

app = QApplication([])

scene = QGraphicsScene()
scene.addRect(0, 0, 100, 100)
view = QGraphicsView(scene)
view.setSceneRect(-60, 20, 100, 100)
view.show()

app.exec_()

Я ожидаю увидеть нижнюю часть прямоугольника, вместо этого вижу нижнюю часть треугольника!

enter image description here

Похоже, что нижний правый угол прямоугольника не учитывается.

Треугольник появляется только для особых случаев (например, специальный сценарий в примере) и никогда не возникает, если видны полный прямоугольник.

Является ли это ошибкой или я делаю что-то неправильно? Может ли быть исправлено?

Моя система: Python 3.3 + PySide 1.2.2 (64 бит) в Windows 7

Ответы

Ответ 1

Это была ошибка, и в то же время она исправлена, по крайней мере, для некоторых комбинаций Qt и Python.

Теперь я использую Windows 10, Python 3.5, PyQt5, а прямоугольник показан как прямоугольник.

Трудно узнать, для каких версий PySide/PyQt и Qt 4.X или 5.x и Python 2.X или 3.X или Windows, Linux, Mac.. ошибка присутствует и для которой нет. Я не допустил ошибку, но думаю, так как он работает прямо сейчас с тем, что у меня ошибка, не будет приоритетом для кого-либо и/или может быть уже исправлена.

Ответ 2

Попробуйте рисовать прямоугольник с помощью

import pygame

pygame.draw.rect(x, y, width, length)

Посмотрите, работает ли это. Это определенно ошибка, поэтому обходите ее.

Ответ 3

Была та же проблема. Он работает, если вы используете виджет GL:

from PySide import QtOpenGL
view.setViewport(QtOpenGL.QGLWidget())

(Python 2.7.6, PySide 1.2.1 x64 (Qt 4.8.5) в Windows 7)

Ответ 4

Попробуйте:

import pygame
from livewires import *
rectangle = rect(x, y, width, height) #note that the size is in pixels

while not keyboard.is_pressed(K_escape)
    rectangle.erase()
    rectangle.draw()
    screen.update()