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, и она работает так, как вы ожидаете!