Source code for sas.qtgui.MainWindow.MainWindow
# UNLESS EXEPTIONALLY REQUIRED TRY TO AVOID IMPORTING ANY MODULES HERE
# ESPECIALLY ANYTHING IN SAS, SASMODELS NAMESPACE
import os
import sys
from sas.sasview import __version__ as SASVIEW_VERSION
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QMdiArea
from PyQt5.QtWidgets import QSplashScreen
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt, QTimer
# Local UI
from sas.qtgui.UI import main_resources_rc
from .UI.MainWindowUI import Ui_SasView
[docs]class MainSasViewWindow(QMainWindow, Ui_SasView):
# Main window of the application
[docs] def __init__(self, screen_resolution, parent=None):
super(MainSasViewWindow, self).__init__(parent)
self.setupUi(self)
# Add the version number to window title
self.setWindowTitle(f"SasView {SASVIEW_VERSION}")
# define workspace for dialogs.
self.workspace = QMdiArea(self)
# some perspectives are fixed size.
# the two scrollbars will help managing the workspace.
self.workspace.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.workspace.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.screen_width = screen_resolution.width()
self.screen_height = screen_resolution.height()
self.setCentralWidget(self.workspace)
QTimer.singleShot(100, self.showMaximized)
# Temporary solution for problem with menubar on Mac
if sys.platform == "darwin": # Mac
self.menubar.setNativeMenuBar(False)
# Create the gui manager
from .GuiManager import GuiManager
try:
self.guiManager = GuiManager(self)
except Exception as ex:
import logging
logging.error("Application failed with: "+str(ex))
[docs] def closeEvent(self, event):
if self.guiManager.quitApplication():
event.accept()
else:
event.ignore()
[docs]def SplashScreen():
"""
Displays splash screen as soon as humanely possible.
The screen will disappear as soon as the event loop starts.
"""
pixmap_path = "images/SVwelcome_mini.png"
if os.path.splitext(sys.argv[0])[1].lower() == ".py":
pixmap_path = "src/sas/qtgui/images/SVwelcome_mini.png"
pixmap = QPixmap(pixmap_path)
splashScreen = QSplashScreen(pixmap)
return splashScreen
[docs]def run_sasview():
app = QApplication([])
#Initialize logger
from sas.logger_config import SetupLogger
SetupLogger(__name__).config_development()
# initialize sasmodels settings
from sas import get_custom_config, get_user_dir
if "SAS_DLL_PATH" not in os.environ:
os.environ["SAS_DLL_PATH"] = os.path.join(
get_user_dir(), "compiled_models")
SAS_OPENCL = get_custom_config().SAS_OPENCL
if SAS_OPENCL and "SAS_OPENCL" not in os.environ:
os.environ["SAS_OPENCL"] = SAS_OPENCL
# Make the event loop interruptable quickly
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
# Main must have reference to the splash screen, so making it explicit
splash = SplashScreen()
splash.show()
app.setAttribute(Qt.AA_EnableHighDpiScaling)
# Main application style.
#app.setStyle('Fusion')
# fix for pyinstaller packages app to avoid ReactorAlreadyInstalledError
if 'twisted.internet.reactor' in sys.modules:
del sys.modules['twisted.internet.reactor']
# DO NOT move the following import to the top!
# (unless you know what you're doing)
import qt5reactor
# Using the Qt5 reactor wrapper from https://github.com/ghtdak/qtreactor
qt5reactor.install()
# DO NOT move the following import to the top!
from twisted.internet import reactor
screen_resolution = app.desktop().screenGeometry()
# Show the main SV window
mainwindow = MainSasViewWindow(screen_resolution)
# no more splash screen
splash.finish(mainwindow)
# Time for the welcome window
mainwindow.guiManager.showWelcomeMessage()
# No need to .exec_ - the reactor takes care of it.
reactor.run()
if __name__ == "__main__":
run_sasview()