QGraphicsView / QGraphicsScene соответствие размера

Как сделать QGraphicsScene с указанным размером и QGraphicsView для мониторинга этой сцены с тем же размером?

Это звучит как глупый вопрос, но рассмотрим следующий тестовый код [1]

import sys
from PyQt4 import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.scene = QtGui.QGraphicsScene(0, 0, 200, 200, self)
        self.view = QtGui.QGraphicsView(self.scene, self)
        #self.view.setMaximumSize(200, 200)
        self.setCentralWidget(self.view)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

Когда я запускаю это, я получаю небольшое окно с QGraphicsView и без полос прокрутки. Если я уменьшу размер окна, появятся полосы прокрутки, потому что я сделал вид меньше указанного размера сцены. Если я увеличу окно, полосы исчезнут, и вид изменится вместе с окном. Все это имеет смысл.

Теперь я снова запускаю тот же код, но с закомментированной строкой (предшествующей #) без комментариев. Окно появляется с представлением внутри, но у представления есть полосы прокрутки. Когда я сжимаю окно, вид также сжимается, но когда я увеличиваю окно, вид только увеличивается до определенного размера. Это не удивительно. Что удивительно, так это то, что с максимальным размером представления полосы прокрутки все еще там. Я не понимаю этого, потому что максимальный размер представления явно соответствует размеру сцены в коде.

Почему это происходит?

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

[1] Я использую PyQt, пользователи C++ просто читают "self" как "this" и "import" как "#include"

РЕДАКТИРОВАТЬ: принятый ответ ниже является абсолютно правильным. Я просто хотел бы добавить для тех, кто читает это, что если ваш вид находится в макете, вы должны также учитывать поля макета. Они могут быть явно установлены в QtDesigner и т. Д.

1 ответ

Решение

Хорошо, я решил это для вас!

QGraphicsView (который является подклассом QFrame) имеет границу. Если вы добавите приведенную ниже строку в ваш метод init:

self.view.setFrameShape(QtGui.QFrame.NoFrame)

затем вы удаляете рамку размером 1px, и она работает так, как вы ожидаете!

Другие вопросы по тегам