def makeWidget(self): super().makeWidget() self.button_row = QtWidgets.QWidget(self.widget) self.button_lay = QtWidgets.QHBoxLayout(self.button_row) self.lay.addWidget(self.button_row) self.reset_button = QtWidgets.QPushButton("Reset", self.button_row) self.save_button = QtWidgets.QPushButton("Save", self.button_row) self.button_lay.addWidget(self.reset_button) self.button_lay.addWidget(self.save_button) self.save_button.setEnabled(False) # row class instance => column (blocksize)=> corresponding widget # ValkkaFSConfigRow has "blocksize" widget that is QSpinBox self.row_instance["blocksize"].widget.valueChanged.connect( self.mod_slot) self.row_instance["n_blocks"].widget.valueChanged.connect( self.mod_slot) # should fix cutemongoforms: SpinBoxIntegerColumn should have # getNotifySignal implemented.. st = ( "- Recording streams is experimental; please report bugs\n" "- Modifying & saving the new parameters will clear all your recordings\n" ) self.info_label = QtWidgets.QLabel(st, self.widget) self.lay.addWidget(self.info_label) self.reset_button.clicked.connect(self.row_instance.clear) self.save_button.clicked.connect(self.save_slot)
def __init__(self, lis, form, title="", parent=None): self.title = title self.lis = lis self.form = form self.widget = QtWidgets.QWidget(parent) # create a new widget self.lay = QtWidgets.QVBoxLayout( self.widget) # attach layout to that widget self.label = QtWidgets.QLabel(self.title, self.widget) self.subwidget = QtWidgets.QWidget(self.widget) self.sublay = QtWidgets.QHBoxLayout(self.subwidget) self.lay.addWidget(self.label) self.lay.addWidget(self.subwidget) self.subwidget.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.lis.widget.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.lis.widget.setMaximumWidth(100) # get widget from List and set its parent to widget self.lis.widget.setParent(self.subwidget) self.form.widget.setParent(self.subwidget) # add List's internal widget to widget's layout self.sublay.addWidget(self.lis.widget) self.sublay.addWidget(self.form.widget) self.lis.widget.currentItemChanged.connect( self.form.chooseForm_slot) # connections between list and the form self.form.signals.modified.connect(self.lis.update_slot) self.modified = self.form.signals.modified # shorthand
def __init__(self, def_pixmap=None, parent=None): QtWidgets.QWidget.__init__(self, parent) self.signals = self.Signals() self.pre = "NLineCrossingVideoWidget : " self.lay = QtWidgets.QVBoxLayout(self) self.canvas = NLineCrossingCanvasWidget(self.signals, def_pixmap, parent=self) self.lay.addWidget(self.canvas) # WARNING: the numerical constants are reversed between min/max...! self.canvas.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.buttons = QtWidgets.QWidget(self) self.lay.addWidget(self.buttons) self.button1 = QtWidgets.QPushButton("Set 1", self.buttons) self.linedef1 = QtWidgets.QSpinBox(self.buttons) self.cbutton1 = QtWidgets.QPushButton("Clear 1", self.buttons) self.button2 = QtWidgets.QPushButton("Set 2", self.buttons) self.linedef2 = QtWidgets.QSpinBox(self.buttons) self.cbutton2 = QtWidgets.QPushButton("Clear 2", self.buttons) self.label1 = QtWidgets.QLabel("Min object size:") self.sizedef = QtWidgets.QSpinBox(self.buttons) self.linedef1.setRange(4, 60) self.linedef2.setRange(4, 60) self.sizedef.setRange(0, 200 * 200) self.sizedef.setValue(50 * 100) # a nice predefined value self.sizedef.setSingleStep(500) for b in [ self.buttons, self.button1, self.linedef1, self.button2, self.linedef2 ]: b.setSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) self.button_lay = QtWidgets.QHBoxLayout(self.buttons) self.button_lay.addWidget(self.button1) self.button_lay.addWidget(self.cbutton1) self.button_lay.addWidget(self.linedef1) self.button_lay.addWidget(self.button2) self.button_lay.addWidget(self.cbutton2) self.button_lay.addWidget(self.linedef2) self.button_lay.addWidget(self.label1) self.button_lay.addWidget(self.sizedef) self.button1.clicked.connect(lambda: self.canvas.define_line_slot(0)) self.button2.clicked.connect(lambda: self.canvas.define_line_slot(1)) self.cbutton1.clicked.connect(lambda: self.canvas.clear_line_slot(0)) self.cbutton2.clicked.connect(lambda: self.canvas.clear_line_slot(1)) self.linedef1.valueChanged.connect( lambda i: self.canvas.set_line_width_slot(0, i)) self.linedef2.valueChanged.connect( lambda i: self.canvas.set_line_width_slot(1, i)) self.sizedef.valueChanged.connect(self.canvas.set_object_size_slot)
def __init__(self, blocking = False, parent = None): super().__init__(parent) self.propagate = True # send signals or not self.setStyleSheet(style.main_gui) if (blocking): self.setWindowModality(QtCore.Qt.ApplicationModal) self.signals = self.Signals() self.tab = QtWidgets.QTabWidget() self.setCentralWidget(self.tab) self.setLayout(QtWidgets.QHBoxLayout())
def QCapsulate(widget, name, blocking = False, nude = False): """Helper function that encapsulates QWidget into a QMainWindow """ class QuickWindow(QtWidgets.QMainWindow): class Signals(QtCore.QObject): close = Signal() show = Signal() def __init__(self, blocking = False, parent = None, nude = False): super().__init__(parent) self.propagate = True # send signals or not self.setStyleSheet(style.main_gui) if (blocking): self.setWindowModality(QtCore.Qt.ApplicationModal) if (nude): # http://doc.qt.io/qt-5/qt.html#WindowType-enum # TODO: create a widget for a proper splashscreen (omitting X11 and centering manually) # self.setWindowFlags(QtCore.Qt.Popup) # Qt 5.9+ : setFlags() # self.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.WindowStaysOnTopHint) self.setWindowFlags(QtCore.Qt.Dialog) self.signals = self.Signals() def closeEvent(self, e): if (self.propagate): self.signals.close.emit() e.accept() def showEvent(self, e): if (self.propagate): self.signals.show.emit() e.accept() def setPropagate(self): self.propagate = True def unSetPropagate(self): self.propagate = False def getWidget(self): return self.centralWidget() win = QuickWindow(blocking = blocking, nude = nude) win.setCentralWidget(widget) win.setLayout(QtWidgets.QHBoxLayout()) win.setWindowTitle(name) return win
def makeWidget(self): super().makeWidget() self.button_row = QtWidgets.QWidget(self.widget) self.button_lay = QtWidgets.QHBoxLayout(self.button_row) self.lay.addWidget(self.button_row) self.reset_button = QtWidgets.QPushButton("Reset", self.button_row) self.save_button = QtWidgets.QPushButton("Save", self.button_row) self.button_lay.addWidget(self.reset_button) self.button_lay.addWidget(self.save_button) self.info_label = QtWidgets.QLabel( "Saving restarts all Valkka services", self.widget) self.lay.addWidget(self.info_label) self.reset_button.clicked.connect(self.row_instance.clear) self.save_button.clicked.connect(self.save_slot)
def setupUi(self): rec = QtWidgets.QApplication.desktop().screenGeometry() height = rec.height() width = rec.width() self.setGeometry(QtCore.QRect(0, 0, width, height // 2)) self.w = QtWidgets.QWidget(self) self.setCentralWidget(self.w) self.lay = QtWidgets.QVBoxLayout(self.w) # return # divide window into three parts self.upper = QtWidgets.QWidget(self.w) self.middle = QtWidgets.QWidget(self.w) self.lower = QtWidgets.QWidget(self.w) self.lowest = QtWidgets.QWidget(self.w) self.lay.addWidget(self.upper) self.lay.addWidget(self.middle) self.lay.addWidget(self.lower) self.lay.addWidget(self.lowest) # upper part: detectors widget and the video itself self.upperlay = QtWidgets.QHBoxLayout(self.upper) # self.widget =QtWidgets.QTextEdit(self.upper) self.widget = QtWidgets.QWidget(self.upper) self.widget_lay = QtWidgets.QVBoxLayout(self.widget) # self.widget = self.mvision_process.getWidget() # self.widget.setParent(self.upper) self.video_area = QtWidgets.QWidget(self.upper) self.video_lay = QtWidgets.QGridLayout(self.video_area) self.upperlay.addWidget(self.widget) self.upperlay.addWidget(self.video_area) self.widget.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.video_area.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) """ [------|--------------------------------------] [Open File] [Close Live] [Play] [Stop] [Rewind] """ self.middlelay = QtWidgets.QHBoxLayout(self.middle) self.slider = QtWidgets.QSlider(QtCore.Qt.Orientation.Horizontal, self.middle) self.middlelay.addWidget(self.slider) self.slider.setTracking(False) self.lowerlay = QtWidgets.QHBoxLayout(self.lower) self.open_file_button = QtWidgets.QPushButton("Open File", self.lower) self.close_file_button = QtWidgets.QPushButton("Close File", self.lower) self.play_button = QtWidgets.QPushButton("Play", self.lower) self.stop_button = QtWidgets.QPushButton("Stop", self.lower) self.rewind_button = QtWidgets.QPushButton("<<", self.lower) self.seek_label = QtWidgets.QLabel("<<", self.lower) self.lowerlay.addWidget(self.open_file_button) self.lowerlay.addWidget(self.close_file_button) self.lowerlay.addWidget(self.play_button) self.lowerlay.addWidget(self.stop_button) self.lowerlay.addWidget(self.rewind_button) self.lowerlay.addWidget(self.seek_label) self.open_file_button.clicked.connect(self.open_file_button_slot) self.close_file_button.clicked.connect(self.close_file_button_slot) self.play_button.clicked.connect(self.play_button_slot) self.stop_button.clicked.connect(self.stop_button_slot) self.rewind_button.clicked.connect(self.rewind_button_slot) self.slider.valueChanged.connect(self.slider_slot) # lowest part: some text self.lowestlay = QtWidgets.QVBoxLayout(self.lowest) self.infotext = QtWidgets.QLabel("info text", self.lowest) self.lowestlay.addWidget(self.infotext)
def __init__(self, ip, slot=1, max_slot=32, parent=None): """ ip corresponds to slot max ip = ip + (max_slot - slot) """ super().__init__(parent) self.setWindowTitle("Configuration Copy") self.max_dn = max_slot - slot assert(isinstance(slot, int)) ip_nums=[] for part in ip.split("."): ip_nums.append(int(part)) self.start_ip_text = ip self.min_num = ip_nums.pop(-1) # take the last number self.max_num = self.min_num + self.max_dn self.min_slot = slot self.stop_ip_text ="" for part in ip_nums: self.stop_ip_text += str(part)+"." self.lay = QtWidgets.QVBoxLayout(self) self.field = QtWidgets.QWidget(self) self.buttons = QtWidgets.QWidget(self) self.lay.addWidget(self.field) self.lay.addWidget(self.buttons) self.field_lay = QtWidgets.QGridLayout(self.field) self.buttons_lay = QtWidgets.QHBoxLayout(self.buttons) self.ip_label = QtWidgets.QLabel("IP range", self.field) self.slot_label = QtWidgets.QLabel("Slot range", self.field) self.field_lay.addWidget(self.ip_label, 0, 0) self.field_lay.addWidget(self.slot_label, 1, 0) self.ip_field = QtWidgets.QWidget(self.field) self.slot_field = QtWidgets.QWidget(self.field) self.field_lay.addWidget(self.ip_field, 0, 1) self.field_lay.addWidget(self.slot_field, 1, 1) self.write_button = QtWidgets.QPushButton("Overwrite slots", self.buttons) self.cancel_button = QtWidgets.QPushButton("Cancel", self.buttons) # self.buttons_lay.addWidget(self.write_button, 2, 0) # self.buttons_lay.addWidget(self.cancel_button, 3, 0) self.buttons_lay.addWidget(self.write_button) self.buttons_lay.addWidget(self.cancel_button) self.ip_field_lay = QtWidgets.QHBoxLayout(self.ip_field) self.slot_field_lay = QtWidgets.QHBoxLayout(self.slot_field) self.ip_field_label = QtWidgets.QLabel( self.start_ip_text + " - " + self.stop_ip_text) self.ip_field_input = QtWidgets.QSpinBox(self.ip_field) self.ip_field_lay.addWidget(self.ip_field_label) self.ip_field_lay.addWidget(self.ip_field_input) self.ip_field_input.setMinimum(self.min_num) self.ip_field_input.setMaximum(self.max_num) self.slot_field_label = QtWidgets.QLabel(self.slot_field) self.slot_field_lay.addWidget(self.slot_field_label) self.ip_field_input.valueChanged.connect(self.update_ip_slot) self.write_button.clicked.connect(lambda: self.done(1)) self.cancel_button.clicked.connect(lambda: self.done(0)) self.update_ip_slot(self.min_num)
def makeWidget(self, qscreen: QtGui.QScreen, geom: tuple = ()): # (re)create the widget, do the same for children # how children are placed on the parent widget, depends on the subclass self.window = self.ContainerWindow(self.signals, self.title, self.parent) # send to correct x-screen self.window.show() self.window.windowHandle().setScreen(qscreen) self.n_xscreen = self.gpu_handler.getXScreenNum( qscreen ) # the correct x-screen number must be passed upstream, to the VideoContainer # continue window / widget construction in the correct x screen self.main_widget = self.ContainerWidget(self.window) # a QTabWidget self.main_layout = QtWidgets.QVBoxLayout(self.main_widget) self.window.setCentralWidget(self.main_widget) if len(geom) >= 4: self.window.setGeometry(geom[0], geom[1], geom[2], geom[3]) # create tabs self.play_video_tab = QtWidgets.QWidget(None) self.play_video_lay = QtWidgets.QVBoxLayout(self.play_video_tab) self.calendar_tab = QtWidgets.QWidget(None) self.calendar_lay = QtWidgets.QVBoxLayout(self.calendar_tab) self.main_widget.addTab(self.play_video_tab, "Recordings") self.main_widget.addTab(self.calendar_tab, "Calendar") # **** Recordings tab ***** # create the grid into "the Recordings" tab (self.play_video_tab) self.grid_widget = self.GridWidget(self.play_video_tab) self.play_video_lay.addWidget(self.grid_widget) self.grid_layout = QtWidgets.QGridLayout(self.grid_widget) self.grid_layout.setHorizontalSpacing(2) self.grid_layout.setVerticalSpacing(2) # ( int left, int top, int right, int bottom ) self.grid_layout.setContentsMargins(0, 0, 0, 0) # put timeline widget under the grid self.timelinewidget = TimeLineWidget(datetime.date.today(), parent=self.play_video_tab) # self.timelinewidget.setLogLevel(logging.DEBUG) self.play_video_lay.addWidget(self.timelinewidget) # put buttons under the timeline self.buttons = QtWidgets.QWidget(self.play_video_tab) self.buttons_lay = QtWidgets.QHBoxLayout(self.buttons) self.play_video_lay.addWidget(self.buttons) self.play_button = QtWidgets.QPushButton("play", self.buttons) self.stop_button = QtWidgets.QPushButton("stop", self.buttons) self.zoom_to_fs_button = QtWidgets.QPushButton("limits", self.buttons) self.buttons_lay.addWidget(self.play_button) self.buttons_lay.addWidget(self.stop_button) self.buttons_lay.addWidget(self.zoom_to_fs_button) # **** Calendar tab ***** # put the calendar into the "Calendar" tab (self.calendar_tab) # calendar self.calendarwidget = CalendarWidget(datetime.date.today(), parent=self.calendar_tab) self.calendar_lay.addWidget(self.calendarwidget) """ self.playback_controller = PlaybackController( calendar_widget = self.calendarwidget, timeline_widget = self.timelinewidget, valkkafs_manager = self.valkkafsmanager, play_button = self.play_button, stop_button = self.stop_button ) """ self.widget_set = WidgetSet(calendar_widget=self.calendarwidget, timeline_widget=self.timelinewidget, play_button=self.play_button, stop_button=self.stop_button, zoom_to_fs_button=self.zoom_to_fs_button) self.playback_controller.register(self.widget_set) class ScreenMenu(QuickMenu): title = "Change Screen" elements = [ QuickMenuElement(title="Screen 1"), QuickMenuElement(title="Screen 2") ] """ TODO: activate after gpu-hopping has been debugged self.screenmenu = ScreenMenu(self.window) self.screenmenu.screen_1.triggered.connect(self.test_slot) self.screenmenu.screen_2.triggered.connect(self.test_slot) """ if (len(self.gpu_handler.true_screens) > 1): # so, there's more than a single x screen: create a button for # changing x-screens self.button = QtWidgets.QPushButton("Change Screen", self.main_widget) self.main_layout.addWidget(self.button) self.button.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.button.clicked.connect(self.change_xscreen_slot) self.placeChildren()