Я новичок в PyQt4 и пытаюсь создать графический интерфейс для создания схемы. Я использую SchemDraw для создания схемы-графа и затем рисую его в FigureCanvas, который является частью GUI. Это работает нормально. Я также создал кнопку для добавления компонента в схему. Это тоже работает. К сожалению, область прокрутки, которая содержит схему, не обновляет размер / полосу прокрутки, поэтому схема становится больше области прокрутки и, следовательно, не отображается должным образом.
Я добавил два скриншота, чтобы показать поведение:
Исходная ситуация
Ситуация после добавления некоторых компонентов
То, что я хочу, это возможность прокрутки влево, если цепь становится шире.
У кого-нибудь есть идея?
Мой код:
import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import FigureManagerQT as Fig
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import PyQt4.QtCore as QtCore
import SchemDraw as schem
import SchemDraw.elements as e
class Window(QtGui.QApplication):
def __init__(self, sys_argv):
super(Window, self).__init__(sys_argv)
screen_resolution = self.desktop().screenGeometry()
width, height = screen_resolution.width(), screen_resolution.height()
self.main_window = QtGui.QMainWindow()
self.main_window.setWindowTitle('App')
self.main_window.showMaximized()
# set the layout
containerMain = QtGui.QWidget()
containerMain.setStyleSheet("background-color:lightGrey;")
mainLayout = QtGui.QVBoxLayout(containerMain)
containerGraph = QtGui.QWidget()
containerGraph.setStyleSheet("background-color:lightGrey ;")
graphLayout = QtGui.QVBoxLayout(containerGraph)
containerCircuit = QtGui.QWidget()
containerCircuit.setFixedWidth(width * 0.7)
containerCircuit.setFixedHeight(height * 0.45)
circuitLayout = QtGui.QVBoxLayout(containerCircuit)
containerInput = QtGui.QWidget()
containerInput.setStyleSheet("background-color:lightGrey ;")
inputLayout = QtGui.QVBoxLayout(containerInput)
containerUpperLayout = QtGui.QWidget()
containerUpperLayout.setStyleSheet("background-color:lightGrey;")
upperLayout = QtGui.QHBoxLayout(containerUpperLayout)
containerLowerLayout = QtGui.QWidget()
containerLowerLayout.setStyleSheet("background-color:lightGrey ;")
lowerLayout = QtGui.QHBoxLayout(containerLowerLayout)
#----------------------------Graph-Layout----------------------------#
self.figure = Figure()
self.canvas = FigureCanvas(self.figure)
graphLayout.addWidget(self.canvas)
#----------------------------Circuit-Layout----------------------------#
self.circuitDrawing = schem.Drawing()
self.circuitDrawing.push()
self.circuitFigure = Figure()
self.circuitCanvas = FigureCanvas(self.circuitFigure)
self.drawCircuit()
self.scrollArea = QtGui.QScrollArea()
self.scrollArea.setWidget(self.circuitCanvas)
buttonDummy1 = QtGui.QPushButton('Add Element to Circuit')
buttonDummy2 = QtGui.QPushButton('Button')
buttonDummy1.clicked.connect(self.drawCircuit)
circuitLayout.addWidget(self.scrollArea)
circuitLayout.addWidget(buttonDummy1)
circuitLayout.addWidget(buttonDummy2)
#----------------------------Input-Layout----------------------------#
buttonDummy3 = QtGui.QPushButton('Button')
buttonDummy3.setFixedSize(50,50)
buttonDummy4 = QtGui.QPushButton('Button')
buttonDummy4.setFixedSize(50,50)
inputLayout.addWidget(buttonDummy3)
inputLayout.addWidget(buttonDummy4)
inputLayout.setContentsMargins(50,50,50,50)
#----------------------------Main-Layout----------------------------#
upperLayout.addWidget(containerCircuit)
upperLayout.addWidget(containerInput)
lowerLayout.addWidget(containerGraph)
mainLayout.addWidget(containerUpperLayout)
mainLayout.addWidget(containerLowerLayout)
self.main_window.setCentralWidget(containerMain)
def drawCircuit(self):
self.circuitDrawing.add(e.RBOX)
ax = self.circuitFigure.add_subplot(111)
# discards the old graph
ax.clear()
# plot data
self.circuitDrawing.draw(ax = ax)
# refresh canvas
self.circuitCanvas.draw()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
main = Window(sys.argv)
sys.exit(app.exec_())
Обновление информации:
Если я добавлю строку self.scrollArea.setWidgetResizable (True), график займет область отверстия, но полоса прокрутки для горизонтальной прокрутки также не отображается.
Если я устанавливаю фиксированный размер в self.circuitCanvas, я получаю горизонтальную полосу прокрутки, но она не обновляется, если схема становится все больше и больше.