def _construct_UI(self): """ Construct the main GUI, consisting of: - Tabbed input widgets (left side) - Tabbed plot widgets (right side) - Logger window (right side, below plot tab) """ # ============== UI Layout with H and V-Splitter ===================== inputTabWidgets = input_tab_widgets.InputTabWidgets(self) # input widgets pltTabWidgets = plot_tab_widgets.PlotTabWidgets(self) # plot widgets self.loggerWin = QPlainTextEdit(self) # logger window self.loggerWin.setReadOnly(True) # set custom right-button context menu policy self.loggerWin.setContextMenuPolicy(Qt.CustomContextMenu) self.loggerWin.customContextMenuRequested.connect(self.logger_win_context_menu) # create context menu and define actions and shortcuts self.popMenu = QMenu(self) self.popMenu.addAction('Select &All', self.loggerWin.selectAll, "Ctrl+A") self.popMenu.addAction('&Copy Selected', self.loggerWin.copy) self.popMenu.addSeparator() self.popMenu.addAction('Clear &Window', self.loggerWin.clear) # ============================================================================= # only needed for logging window height measured in lines # mSize = QFontMetrics(loggerWin.font()) # row4_height = mSize.lineSpacing() * 4 # add logger window underneath plot Tab Widgets spltVPltLogger = QSplitter(QtCore.Qt.Vertical) spltVPltLogger.addWidget(pltTabWidgets) spltVPltLogger.addWidget(self.loggerWin) # create horizontal splitter that contains all subwidget groups spltHMain = QSplitter(QtCore.Qt.Horizontal) spltHMain.addWidget(inputTabWidgets) spltHMain.addWidget(spltVPltLogger) spltHMain.setStretchFactor(1,4) # relative initial sizes of subwidgets spltHMain.setContentsMargins(*rc.params['wdg_margins']) spltHMain.setFocus() # make spltHMain occupy the main area of QMainWindow and make QMainWindow its parent !!! self.setCentralWidget(spltHMain) spltVPltLoggerH = spltVPltLogger.size().height() spltVPltLogger.setSizes([spltVPltLoggerH*0.95, spltVPltLoggerH*0.05 - 8]) self.setWindowTitle('pyFDA - Python Filter Design and Analysis') #=============== Menubar ======================================= # aboutAction = QAction('&About', self) # aboutAction.setShortcut('Ctrl+A') # aboutAction.setStatusTip('Info about pyFDA') # # menubar = self.menuBar() # fileMenu = menubar.addMenu('&About') # fileMenu.addAction(aboutAction) # self.statusMessage("Application is initialized.") #---------------------------------------------------------------------- # GLOBAL SIGNALS & SLOTs #---------------------------------------------------------------------- self.sig_rx.connect(self.process_sig_rx) #---------------------------------------------------------------------- # SIGNALS & SLOTs #---------------------------------------------------------------------- # Here, signals about spec and design changes from lower hierarchies # are distributed. At the moment, only changes in the input widgets are # routed to the plot widgets: inputTabWidgets.sig_tx.connect(pltTabWidgets.sig_rx) inputTabWidgets.sig_tx.connect(self.process_sig_rx) pltTabWidgets.sig_tx.connect(inputTabWidgets.sig_rx) # open pop-up "about" window #aboutAction.triggered.connect(self.aboutWindow) # trigger the close event in response to sigQuit generated in another subwidget: # inputTabWidgets.input_filter_specs.sigQuit.connect(self.close) # when a message has been written, pass it via signal-slot mechanism and # print it to logger window XStream.stdout().messageWritten.connect(self.loggerWin.appendHtml)
def _construct_UI(self): """ Construct the main GUI, consisting of: - Subwindow for parameter selection [-> ChooseParams.ChooseParams()] - Filter Design button [-> self.startDesignFilt()] - Plot Window [-> plotAll.plotAll()] """ # ============== UI Layout ===================================== self.main_widget = QWidget( self) # this widget contains all subwidget groups layHMain = QHBoxLayout( self.main_widget) # horizontal layout of all groups # Instantiate subwidget groups self.inputTabWidgets = input_tab_widgets.InputTabWidgets( self) # input widgets self.pltTabWidgets = plot_tab_widgets.PlotTabWidgets( self) # plot widgets # Test self.pltTabWidgets = plot_tab_widgets.MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100) if SPLITTER: # use splitter design (variable ratio for input / plot subwidget sizes) layVInput = QVBoxLayout() layVInput.addWidget(self.inputTabWidgets) layVPlt = QVBoxLayout() layVPlt.addWidget(self.pltTabWidgets) frmInput = QFrame() frmInput.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) frmInput.setLayout(layVInput) frmInput.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) frmPlt = QFrame() frmPlt.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) frmPlt.setLayout(layVPlt) frmPlt.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) splitter = QSplitter(QtCore.Qt.Horizontal) splitter.addWidget(frmInput) splitter.addWidget(frmPlt) splitter.setStretchFactor( 1, 4) # factors for the initial sizes of subwidgets # splitter.setSizes([200,600]) layHMain.addWidget(splitter) else: # no splitter design, only use layHMain layout self.inputTabWidgets.setMaximumWidth( 420) # comment out for splitter layHMain.addWidget(self.inputTabWidgets) layHMain.addWidget(self.pltTabWidgets) layHMain.setContentsMargins(0, 0, 0, 0) #(left, top, right, bottom) self.setWindowTitle('pyFDA - Python Filter Design and Analysis') if SCROLL: # Create scroll area and "monitor" _widget whether scrollbars are needed scrollArea = QScrollArea() scrollArea.setWidget( self.main_widget) # make main widget "scrollable" #============= Set behaviour of scroll area ====================== # scroll bars appear when the scroll area shrinks below this size: scrollArea.setMinimumSize(QtCore.QSize(800, 500)) # scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) #default # scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) # default scrollArea.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) # Size of monitored widget is allowed to grow: scrollArea.setWidgetResizable(True) self.main_widget.setFocus() # make main_widget occupy the main area of QMainWidget # and make QMainWindow its parent !!! self.setCentralWidget(self.main_widget) #=============== Menubar ======================================= # aboutAction = QAction('&About', self) # aboutAction.setShortcut('Ctrl+A') # aboutAction.setStatusTip('Info about pyFDA') # # menubar = self.menuBar() # fileMenu = menubar.addMenu('&About') # fileMenu.addAction(aboutAction) # self.statusMessage("Application is initialized.") #---------------------------------------------------------------------- # SIGNALS & SLOTs #---------------------------------------------------------------------- # Here, signals about spec and design changes from lower hierarchies # are distributed. At the moment, only changes in the input widgets are # routed to the plot widgets: # # sigSpecsChanged: signal indicating that filter SPECS have changed, # requiring partial update of some plot widgets: self.inputTabWidgets.sigSpecsChanged.connect( self.pltTabWidgets.update_view) # # sigFilterDesigned: signal indicating that filter has been DESIGNED, # requiring full update of all plot widgets: self.inputTabWidgets.sigFilterDesigned.connect( self.pltTabWidgets.update_data) # # sigReadFilters: button has been pressed to rebuild filter tree: self.inputTabWidgets.file_io.sigReadFilters.connect( self.ftb.init_filters) # open pop-up "about" window #aboutAction.triggered.connect(self.aboutWindow) # trigger the close event in response to sigQuit generated in another subwidget: self.inputTabWidgets.filter_specs.sigQuit.connect(self.close) logger.debug("Main routine initialized!")
def _construct_UI(self): """ Construct the main GUI, consisting of: - Subwindow for parameter selection [-> ChooseParams.ChooseParams()] - Filter Design button [-> self.startDesignFilt()] - Plot Window [-> plotAll.plotAll()] """ # ============== UI Layout ===================================== self.main_widget = QWidget(self) # this widget contains all subwidget groups layHMain = QHBoxLayout(self.main_widget) # horizontal layout of all groups # Instantiate subwidget groups self.inputTabWidgets = input_tab_widgets.InputTabWidgets(self) # input widgets self.pltTabWidgets = plot_tab_widgets.PlotTabWidgets(self) # plot widgets if SPLITTER: # use splitter design (variable ratio for input / plot subwidget sizes) splitter = QSplitter(QtCore.Qt.Horizontal) splitter.addWidget(self.inputTabWidgets) splitter.addWidget(self.pltTabWidgets) splitter.setStretchFactor(1,4) # relative initial sizes of subwidgets # splitter.setSizes([200,600]) # absolute initial sizes of subwidgets layHMain.addWidget(splitter) layHMain.setContentsMargins(*rc.params['wdg_margins']) else: # no splitter design, only use layHMain layout self.inputTabWidgets.setMaximumWidth(420) layHMain.addWidget(self.inputTabWidgets) layHMain.addWidget(self.pltTabWidgets) layHMain.setContentsMargins(0, 0, 0, 0) # R, T, L, B self.setWindowTitle('pyFDA - Python Filter Design and Analysis') self.main_widget.setFocus() # make main_widget occupy the main area of QMainWidget # and make QMainWindow its parent !!! self.setCentralWidget(self.main_widget) #=============== Menubar ======================================= # aboutAction = QAction('&About', self) # aboutAction.setShortcut('Ctrl+A') # aboutAction.setStatusTip('Info about pyFDA') # # menubar = self.menuBar() # fileMenu = menubar.addMenu('&About') # fileMenu.addAction(aboutAction) # self.statusMessage("Application is initialized.") #---------------------------------------------------------------------- # SIGNALS & SLOTs #---------------------------------------------------------------------- # Here, signals about spec and design changes from lower hierarchies # are distributed. At the moment, only changes in the input widgets are # routed to the plot widgets: # # sigViewChanged: signal indicating that filter VIEW has changed, # requiring partial update of some plot widgets: self.inputTabWidgets.sigViewChanged.connect(self.pltTabWidgets.update_view) # # sigSpecsChanged: signal indicating that filter SPECS have changed, # requiring partial update of some plot widgets: self.inputTabWidgets.sigSpecsChanged.connect(self.pltTabWidgets.update_view) # # sigFilterDesigned: signal indicating that filter has been DESIGNED, # requiring full update of all plot widgets: self.inputTabWidgets.sigFilterDesigned.connect(self.pltTabWidgets.update_data) # open pop-up "about" window #aboutAction.triggered.connect(self.aboutWindow) # trigger the close event in response to sigQuit generated in another subwidget: self.inputTabWidgets.filter_specs.sigQuit.connect(self.close) logger.info("Main routine initialized, using Qt {0}".format(QT_VERSION_STR))
def _construct_UI(self): """ Construct the main GUI, consisting of: - Subwindow for parameter selection [-> ChooseParams.ChooseParams()] - Filter Design button [-> self.startDesignFilt()] - Plot Window [-> plotAll.plotAll()] """ # ============== UI Layout ===================================== self.main_widget = QWidget( self) # this widget contains all subwidget groups layHMain = QHBoxLayout( self.main_widget) # horizontal layout of all groups laySubWin = QSplitter(QtCore.Qt.Horizontal) laySubRight = QSplitter(QtCore.Qt.Vertical) # Instantiate subwidget groups self.inputTabWidgets = input_tab_widgets.InputTabWidgets( self) # input widgets self.pltTabWidgets = plot_tab_widgets.PlotTabWidgets( self) # plot widgets self.statusWin = QPlainTextEdit(self) # status window mSize = QFontMetrics(self.statusWin.font()) rowHt = mSize.lineSpacing() self.statusWin.setFixedHeight(4 * rowHt + 4) self.statusWin.setReadOnly(True) #self._title = QtGui.QLabel('Status Log') #self._title.setAlignment(QtCore.Qt.AlignCenter) # Add status window underneath plot Tab Widgets laySubRight.addWidget(self.pltTabWidgets) #laySub.addWidget(self._title) laySubRight.addWidget(self.statusWin) laySubRight.setStretchFactor(0, 0) # relative initial sizes of subwidgets #laySubRight.setStretchFactor(1,1) # relative initial sizes of subwidgets laySubWin.addWidget(self.inputTabWidgets) laySubWin.addWidget(laySubRight) laySubWin.setStretchFactor(1, 4) # relative initial sizes of subwidgets layHMain.addWidget(laySubWin) layHMain.setContentsMargins(*rc.params['wdg_margins']) self.setWindowTitle('pyFDA - Python Filter Design and Analysis') self.main_widget.setFocus() # make main_widget occupy the main area of QMainWidget # and make QMainWindow its parent !!! self.setCentralWidget(self.main_widget) #=============== Menubar ======================================= # aboutAction = QAction('&About', self) # aboutAction.setShortcut('Ctrl+A') # aboutAction.setStatusTip('Info about pyFDA') # # menubar = self.menuBar() # fileMenu = menubar.addMenu('&About') # fileMenu.addAction(aboutAction) # self.statusMessage("Application is initialized.") #---------------------------------------------------------------------- # SIGNALS & SLOTs #---------------------------------------------------------------------- # Here, signals about spec and design changes from lower hierarchies # are distributed. At the moment, only changes in the input widgets are # routed to the plot widgets: # # sigViewChanged: signal indicating that filter VIEW has changed, # requiring partial update of some plot widgets: self.inputTabWidgets.sigViewChanged.connect( self.pltTabWidgets.update_view) # # sigSpecsChanged: signal indicating that filter SPECS have changed, # requiring partial update of some plot widgets: self.inputTabWidgets.sigSpecsChanged.connect( self.pltTabWidgets.update_view) # # sigFilterDesigned: signal indicating that filter has been DESIGNED, # requiring full update of all plot widgets: self.inputTabWidgets.sigFilterDesigned.connect( self.pltTabWidgets.update_data) # open pop-up "about" window #aboutAction.triggered.connect(self.aboutWindow) # trigger the close event in response to sigQuit generated in another subwidget: self.inputTabWidgets.filter_specs.sigQuit.connect(self.close) XStream.stdout().messageWritten.connect(self.statusWin.appendPlainText)
def _construct_UI(self): """ Construct the main GUI, consisting of: - Subwindow for parameter selection [-> ChooseParams.ChooseParams()] - Filter Design button [-> self.startDesignFilt()] - Plot Window [-> plotAll.plotAll()] """ # ============== UI Layout with H and V-Splitter ===================== inputTabWidgets = input_tab_widgets.InputTabWidgets( self) # input widgets pltTabWidgets = plot_tab_widgets.PlotTabWidgets(self) # plot widgets loggerWin = QPlainTextEdit(self) # status window loggerWin.setReadOnly(True) # only needed for logging window height measured in lines # mSize = QFontMetrics(loggerWin.font()) # row4_height = mSize.lineSpacing() * 4 # add logger window underneath plot Tab Widgets spltVPltLogger = QSplitter(QtCore.Qt.Vertical) spltVPltLogger.addWidget(pltTabWidgets) spltVPltLogger.addWidget(loggerWin) # create horizontal splitter that contains all subwidget groups spltHMain = QSplitter(QtCore.Qt.Horizontal) spltHMain.addWidget(inputTabWidgets) spltHMain.addWidget(spltVPltLogger) spltHMain.setStretchFactor(1, 4) # relative initial sizes of subwidgets spltHMain.setContentsMargins(*rc.params['wdg_margins']) spltHMain.setFocus() # make spltHMain occupy the main area of QMainWindow and make QMainWindow its parent !!! self.setCentralWidget(spltHMain) spltVPltLoggerH = spltVPltLogger.size().height() spltVPltLogger.setSizes( [spltVPltLoggerH * 0.95, spltVPltLoggerH * 0.05 - 8]) self.setWindowTitle('pyFDA - Python Filter Design and Analysis') #=============== Menubar ======================================= # aboutAction = QAction('&About', self) # aboutAction.setShortcut('Ctrl+A') # aboutAction.setStatusTip('Info about pyFDA') # # menubar = self.menuBar() # fileMenu = menubar.addMenu('&About') # fileMenu.addAction(aboutAction) # self.statusMessage("Application is initialized.") #---------------------------------------------------------------------- # SIGNALS & SLOTs #---------------------------------------------------------------------- # Here, signals about spec and design changes from lower hierarchies # are distributed. At the moment, only changes in the input widgets are # routed to the plot widgets: # # sigViewChanged: signal indicating that filter VIEW has changed, # requiring partial update of some plot widgets: inputTabWidgets.sigViewChanged.connect(pltTabWidgets.update_view) # # sigSpecsChanged: signal indicating that filter SPECS have changed, # requiring partial update of some plot widgets: inputTabWidgets.sigSpecsChanged.connect(pltTabWidgets.update_view) # # sigFilterDesigned: signal indicating that filter has been DESIGNED, # requiring full update of all plot widgets: inputTabWidgets.sigFilterDesigned.connect(pltTabWidgets.update_data) # open pop-up "about" window #aboutAction.triggered.connect(self.aboutWindow) # trigger the close event in response to sigQuit generated in another subwidget: inputTabWidgets.filter_specs.sigQuit.connect(self.close) # when a message has been written, pass it via signal-slot mechanism and # print it to logger window XStream.stdout().messageWritten.connect(loggerWin.appendHtml)