У меня есть пара разных проблем, которые я пытаюсь решить, и я не могу разобраться.Я раньше не работал с QGraphicsView
и т. Д., Но я создал QGraphicsView
, в который я пытаюсь загрузить изображения, и я пытаюсь использовать QSpinBox
для динамического управления количеством столбцов, которые изображения используют в строке.Например, если у меня есть 16 изображений, а для QSpinBox
установлено значение 4 ", которое у меня установлено по умолчанию", то должно быть 4 строки и 4 столбца изображений.Кажется, что эта часть работает нормально, но код не очень хорош.Я не мог найти способ контролировать количество столбцов и строк изображений, если не удаляю и не перезагружаю их все каждый раз, когда изменяется количество.В итоге я очистил всю сцену и перезагрузил все, потому что у меня были проблемы с удалением предметов по отдельности.
Основная проблема, с которой я столкнулся сейчас, - это правильная установка прямоугольника для строк и столбцов.Я пытаюсь изменить размер сцены с изменениями, не оставляя полосы прокрутки с кучей пустого пространства.
Вот как это выглядит в начале при загрузке изображений.
Вот как это выглядит после прокрутки QSpinBox
немного.В этой точке должна быть только вертикальная полоса прокрутки, а не горизонтальная полоса прокрутки с кучей пустого пространства.
После некоторых проб и ошибок я понял, что в своем коде я могу установить прямоугольник сцены следующим образом self.scene.setSceneRect(QRectF(self.graphics_widget.rect()))
, и он, кажется, работает отличночтобы исправить проблему с полосой прокрутки, но я могу заставить ее работать только тогда, когда я каким-то образом запускаю ее вручную, и для этого примера это то, что делает кнопка «Установить Rect».
Вот пример.После нажатия кнопки «Установить Rect» вертикальная полоса прокрутки будет правильно удалена, а горизонтальная полоса прокрутки будет точной шириной всей строки, как и должно быть.
Если я пытаюсь установить прямоугольную сцену автоматически после того, как все загружено, это дает мне неправильную ширину и высоту, но по какой-то причине работает правильно, если яустановите его вручную с помощью кнопки и т. д.
Другая небольшая проблема, с которой я сталкиваюсь, заключается в том, чтобы красная полоса сверху растягивалась дальше, чем область области просмотра.Если я попытаюсь прокрутить горизонтально, когда горизонтальная полоса прокрутки показывает, это выглядит так, и я бы хотел, чтобы она растягивалась на всю ширину.
Хотя это не так уж и страшно, я уверен, что смогу это понять.Моя главная задача состоит в том, чтобы установить прямоугольник сцены автоматически, чтобы все работало правильно, не оставляя полос прокрутки с кучей пустого пространства.
У кого-нибудь есть какие-либо предложения?Спасибо.
Вот мой код:
from PySide2.QtCore import QRectF, QSizeF, QRect, Qt, QPointF
from PySide2.QtGui import QPixmap, QFont, QColor, QPen, QBrush
from PySide2.QtWidgets import QGraphicsWidget, QWidget, QVBoxLayout, QPushButton, QHBoxLayout, \
QSpinBox, QGraphicsView, QGraphicsScene, QGraphicsGridLayout, QApplication
class PixmapItem(QGraphicsWidget):
def __init__(self, image, parent=None):
super(PixmapItem, self).__init__(parent)
self.pic = QPixmap(image)
self._boundingRect = QRectF()
self.pic_size = self.pic.rect().size()
def boundingRect(self):
width = self.pic_size.width()
height = self.pic_size.height()
pix_rect = QRectF(0.0, 0.0, width, height)
self._boundingRect = pix_rect
return pix_rect
def sizeHint(self, which, constraint=QSizeF()):
return self._boundingRect.size()
def paint(self, painter, option, widget):
painter.drawPixmap(QRect(0, 40, self.pic_size.width(), self.pic_size.height()), self.pic, self.pic.rect())
class MyScene(QGraphicsScene):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def drawBackground(self, painter, rect):
bg_brush = QBrush(QColor(255, 255, 255), Qt.SolidPattern)
painter.fillRect(rect, bg_brush)
#Red bar on top
painter.setPen(QPen(Qt.NoPen))
brush = QBrush(QColor(139, 0, 0), Qt.SolidPattern)
r = QRectF(QPointF(0, 0), QSizeF(rect.width(), 30))
painter.fillRect(r, brush)
self.update()
class Widget(QWidget):
def __init__(self):
super(Widget, self).__init__()
self.resize(330, 330)
self.imglist = ["py.png", "py.png","py.png","py.png","py.png","py.png",
"py.png","py.png","py.png","py.png","py.png","py.png"]
self._layout = QVBoxLayout()
self._layout2 = QHBoxLayout()
self.btn = QPushButton("Load")
self.column_spinbox = QSpinBox()
self.column_spinbox.setRange(1, 25)
self.column_spinbox.setValue(4)
self.column_spinbox.setSingleStep(1)
self.btn2 = QPushButton("Set Rect")
self._layout2.addWidget(self.btn)
self._layout2.addWidget(self.column_spinbox)
self._layout2.addWidget(self.btn2)
self._layout.addLayout(self._layout2)
self._layout3 = QHBoxLayout()
self.view = QGraphicsView()
self.view.setAlignment(Qt.AlignLeft | Qt.AlignTop)
self.scene = MyScene()
self.view.setScene(self.scene)
self.graphics_widget = QGraphicsWidget()
self.scene.addItem(self.graphics_widget)
self.graphics_layout = QGraphicsGridLayout()
self.graphics_widget.setLayout(self.graphics_layout)
self._layout3.addWidget(self.view)
self._layout.addLayout(self._layout3)
self.setLayout(self._layout)
self.btn.clicked.connect(self._load_pix)
self.btn2.clicked.connect(self._set_rect)
self.column_spinbox.valueChanged.connect(self.set_columns)
def _set_rect(self):
self.scene.setSceneRect(QRectF(self.graphics_widget.rect()))
def _load_pix(self):
for img in range(len(self.imglist)):
pixmap = PixmapItem(self.imglist[img])
row, column = divmod(img, self.column_spinbox.value())
self.graphics_layout.addItem(pixmap, row, column)
self.graphics_layout.setColumnSpacing(column, 15)
self.graphics_layout.setRowSpacing(row, 15)
self.scene.setSceneRect(QRectF(self.graphics_widget.rect()))
# Add text to top
item = self.scene.addText("Some Sample Text.", QFont("Arial", 16, QFont.Light))
item.setDefaultTextColor(QColor(255, 255, 255))
def set_columns(self):
self.view.scene().clear()
#After clearing the scene, re-add the widgets
self.graphics_widget = QGraphicsWidget()
self.scene.addItem(self.graphics_widget)
self.graphics_layout = QGraphicsGridLayout()
self.graphics_widget.setLayout(self.graphics_layout)
for img in range(len(self.imglist)):
pixmap = PixmapItem(self.imglist[img], self.graphics_widget)
row, column = divmod(img, self.column_spinbox.value())
self.graphics_layout.addItem(pixmap, row, column)
self.graphics_layout.setColumnSpacing(column, 15)
self.graphics_layout.setRowSpacing(row, 15)
self.scene.setSceneRect(QRectF(self.graphics_widget.rect()))
#Add text to top again
item = self.scene.addText("Some Sample Text.", QFont("Arial", 16, QFont.Light))
item.setDefaultTextColor(QColor(255, 255, 255))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
widget = Widget()
widget.show()
app.exec_()