def add_tool_buttons(self): """ Add toolbar buttons of add, edit and delete buttons. :return: None :rtype: NoneType """ tool_buttons = QToolBar() tool_buttons.setObjectName('form_toolbar') tool_buttons.setIconSize(QSize(16, 16)) self.addSTR = QAction(GuiUtils.get_icon('add.png'), QApplication.translate('ViewSTRWidget', 'Add'), self) self.editSTR = QAction(GuiUtils.get_icon('edit.png'), QApplication.translate('ViewSTRWidget', 'Edit'), self) self.deleteSTR = QAction( GuiUtils.get_icon('remove.png'), QApplication.translate('ViewSTRWidget', 'Remove'), self) tool_buttons.addAction(self.addSTR) tool_buttons.addAction(self.editSTR) tool_buttons.addAction(self.deleteSTR) self.toolbarVBox.addWidget(tool_buttons)
def __init__(self, parent=None): """ initailize class variables here """ super(ProfileInstanceRecords, self).__init__(parent) self.setupUi(self) self.path = None self.instance_list = [] self.relations = OrderedDict() self.parent_ids = {} self.importlogger = ImportLogger() self._notif_bar_str = NotificationBar(self.vlnotification) self.chk_all.setCheckState(Qt.Checked) self.entity_model = EntitiesModel() self.uuid_extractor = InstanceUUIDExtractor(self.path) self.btn_chang_dir.setIcon(GuiUtils.get_icon("open_file.png")) self.btn_refresh.setIcon(GuiUtils.get_icon("update.png")) self.chk_all.stateChanged.connect(self.change_check_state) # self.cbo_profile.currentIndexChanged.connect(self.current_profile_changed) self.btn_chang_dir.clicked.connect(self.on_directory_search) self.lst_widget.itemClicked.connect(self.user_selected_entities) self.btn_refresh.clicked.connect(self.update_files_with_custom_filter) self.buttonBox.button(QDialogButtonBox.Save).setText('Import') # self.load_config() self.init_file_path() self.current_profile_changed() self.change_check_state(self.chk_all.checkState()) self.instance_dir()
def __init__(self, config, formatter=None, parent=None): QWidget.__init__(self, parent) EntitySearchItem.__init__(self, formatter) self.setupUi(self) self.tbSTRViewEntity.setTabIcon(0, GuiUtils.get_icon('filter.png')) self.tbSTRViewEntity.setTabIcon(1, GuiUtils.get_icon('period_blue.png')) self.config = config self.setConfigOptions() self.curr_profile = current_profile() self.social_tenure = self.curr_profile.social_tenure self.str_model = entity_model(self.social_tenure) # Model for storing display and actual mapping values self._completer_model = None self._proxy_completer_model = None # Hook up signals self.cboFilterCol.currentIndexChanged.connect( self._on_column_index_changed) self.init_validity_dates() self.validity_from_date.dateChanged.connect(self.set_minimum_to_date) self.validity.setDisabled(True) self.init_validity_checkbox()
def __init__(self, iface): QDialog.__init__(self, iface.mainWindow()) self.setupUi(self) QgsGui.enableAutoGeometryRestore(self) self.btn_composer_out_folder.setIcon( GuiUtils.get_icon('open_file.png')) self.btn_template_folder.setIcon(GuiUtils.get_icon('open_file.png')) self.btn_supporting_docs.setIcon(GuiUtils.get_icon('open_file.png')) self.iface = iface self.notif_bar = NotificationBar(self.vlNotification, 6000) self._apply_btn = self.buttonBox.button(QDialogButtonBox.Apply) self._reg_config = RegistryConfig() self._db_config = DatabaseConfig() version = version_from_metadata() #upgrade_label_text = self.label_9.text().replace( #'1.4', version.strip() #) #self.label_9.setText(upgrade_label_text) # Connect signals self._apply_btn.clicked.connect(self.apply_settings) self.buttonBox.accepted.connect(self.on_accept) self.chk_pg_connections.toggled.connect(self._on_use_pg_connections) self.cbo_pg_connections.currentIndexChanged.connect( self._on_pg_profile_changed) self.btn_db_conn_clear.clicked.connect(self.clear_properties) self.btn_test_db_connection.clicked.connect(self._on_test_connection) self.btn_supporting_docs.clicked.connect( self._on_choose_supporting_docs_path) self.btn_template_folder.clicked.connect( self._on_choose_doc_designer_template_path) self.btn_composer_out_folder.clicked.connect( self._on_choose_doc_generator_output_path) self._config = StdmConfiguration.instance() self._default_style_sheet = self.txtRepoLocation.styleSheet() #self.upgradeButton.toggled.connect(self.manage_upgrade) #self.manage_upgrade() self.init_gui() self.profile_entity_widget = None self.cache = None self.sort_record_widget = None self.tabWidget.setCurrentIndex(0) self.btnAdd.clicked.connect(self.add_sorting_column) self.init_sorting_widgets(self.cbo_profiles.currentText()) self.cbo_profiles.currentIndexChanged.connect(self.profile_changed)
def setupUi(self): self.setObjectName("mirrormap") gridLayout = QGridLayout(self) gridLayout.setContentsMargins(0, 0, gridLayout.verticalSpacing(), gridLayout.verticalSpacing()) self.canvas = QgsMapCanvas(self) self.canvas.setCanvasColor(QColor(255, 255, 255)) settings = QSettings() gridLayout.addWidget(self.canvas, 0, 0, 1, 5) self.addLayerBtn = QToolButton(self) # self.addLayerBtn.setToolButtonStyle( Qt.ToolButtonTextBesideIcon ) # self.addLayerBtn.setText("Add current layer") self.addLayerBtn.setIcon(GuiUtils.get_icon("add.png")) self.addLayerBtn.clicked.connect(self.tool_add_layer) gridLayout.addWidget(self.addLayerBtn, 1, 0, 1, 1) self.delLayerBtn = QToolButton(self) # self.delLayerBtn.setToolButtonStyle( Qt.ToolButtonTextBesideIcon ) # self.delLayerBtn.setText("Remove current layer") self.delLayerBtn.setIcon(GuiUtils.get_icon("remove.png")) self.delLayerBtn.clicked.connect(self.tool_remove_layer) gridLayout.addWidget(self.delLayerBtn, 1, 1, 1, 1) self.renderCheck = QCheckBox("Render", self) self.renderCheck.toggled.connect(self.toggleRender) self.renderCheck.setChecked(True) gridLayout.addWidget(self.renderCheck, 1, 2, 1, 1) self.scaleFactorLabel = QLabel(self) self.scaleFactorLabel.setText("Scale factor:") self.scaleFactorLabel.setAlignment(Qt.AlignRight | Qt.AlignVCenter) gridLayout.addWidget(self.scaleFactorLabel, 1, 3, 1, 1) self.scaleFactor = QDoubleSpinBox(self) self.scaleFactor.setMinimum(0.0) self.scaleFactor.setMaximum(1000.0) self.scaleFactor.setDecimals(3) self.scaleFactor.setValue(1) self.scaleFactor.setObjectName("scaleFactor") self.scaleFactor.setSingleStep(.05) gridLayout.addWidget(self.scaleFactor, 1, 4, 1, 1) self.scaleFactor.valueChanged.connect(self.onExtentsChanged) # Add a default pan tool self.toolPan = QgsMapToolPan(self.canvas) self.canvas.setMapTool(self.toolPan) self.scaleFactor.valueChanged.connect(self.onExtentsChanged) self.set_iface(self.iface)
def _setup_str_tab(self, is_party_unit: bool): """ Creates the STR relationship tab """ from stdm.ui.feature_details import DetailsTreeView layout = QVBoxLayout() hl = QHBoxLayout() add_btn = QToolButton(self) add_btn.setText(self.tr('Create STR')) add_btn.setIcon(GuiUtils.get_icon('add.png')) hl.addWidget(add_btn) add_btn.clicked.connect(self._create_str) edit_btn = QToolButton(self) edit_btn.setText(self.tr('Edit')) edit_btn.setIcon(GuiUtils.get_icon('edit.png')) edit_btn.setDisabled(True) hl.addWidget(edit_btn) view_document_btn = QToolButton(self) view_document_btn.setText(self.tr('View Supporting Documents')) view_document_btn.setIcon(GuiUtils.get_icon('document.png')) view_document_btn.setDisabled(True) hl.addWidget(view_document_btn) hl.addStretch() layout.addLayout(hl) self.details_tree_view = DetailsTreeView( parent=self, plugin=self.plugin, edit_button=edit_btn, view_document_button=view_document_btn) self.details_tree_view.activate_feature_details( True, follow_layer_selection=False) self.details_tree_view.model.clear() if is_party_unit: self.details_tree_view.search_party(self.entity, [self.ent_model.id]) else: self.details_tree_view.search_spatial_unit(self.entity, [self.ent_model.id]) layout.addWidget(self.details_tree_view) w = QWidget() w.setLayout(layout) self.entity_tab_widget.addTab(w, self.tr('STR'))
def loadColumns(self, table): # Load textual and spatial (if available) columns # Get spatial columns first spColumns = table_column_names(table, True, creation_order=True) self.cboSpatialCols_2.clear() self.cboSpatialCols_2.addItems(spColumns) # Textual Columns self.lstSrcCols_2.clear() self.allCols = table_column_names(table, creation_order=True) for sc in spColumns: colIndex = getIndex(self.allCols, sc) if colIndex != -1: self.allCols.remove(sc) for col in self.allCols: if ' ' in col: col = '"{}"'.format(col) tabItem = QListWidgetItem(col, self.lstSrcCols_2) tabItem.setCheckState(Qt.Unchecked) tabItem.setIcon(GuiUtils.get_icon("column.png")) self.lstSrcCols_2.addItem(tabItem) if len(spColumns) > 0: self.cboSpatialCols_2.setEnabled(True)
def __init__(self, parent=None, **kwargs): super(ImageExportSettings, self).__init__(parent) self.setupUi(self) self.btn_path.setIcon(GuiUtils.get_icon('open_file.png')) self._image_tr = self.tr('Image') self.notif_bar = NotificationBar(self.vl_notification, 6000) # Connect signals self.btn_path.clicked.connect(self._on_choose_image_path) self.buttonBox.accepted.connect(self.on_accept) self.sb_resolution.valueChanged.connect(self._on_resolution_changed) # Set color button defaults self._default_color = Qt.white self.btn_color.setDefaultColor(self._default_color) self.btn_color.setColor(self._default_color) self.btn_color.setAllowOpacity(True) self.path = kwargs.get('image_path', '') self.resolution = kwargs.get('resolution', '96') self.background_color = kwargs.get('background', Qt.transparent) self._update_controls()
def action(self): dataLabelAct = QAction( GuiUtils.get_icon("db_field.png"), QApplication.translate("DataLabelConfig", "Add data label"), self.mainWindow()) return dataLabelAct
def __init__(self, parent, source_cols, dest_table, dest_col, src_col): QDialog.__init__(self, parent) self.setupUi(self) self.btn_source_doc_folder.setIcon(GuiUtils.get_icon('open_file.png')) TranslatorDialogBase.__init__(self, source_cols, dest_table, dest_col, src_col) self._notif_bar = NotificationBar(self.vlNotification) # Assert if the entity supports documents self._assert_entity_supports_documents() # Set the source document directory self.source_document_directory = None # Document type name self._document_type_name = self._dest_col # Document type ID self._document_type_id = None # Set document type ID self._set_document_type_id() # Connect slots self.btn_source_doc_folder.clicked.connect( self._load_source_document_directory_selector)
def action(self): qrcode_act = QAction( GuiUtils.get_icon("qrcode.png"), QApplication.translate("QRCodeConfig", "Add QR Code"), self.mainWindow()) return qrcode_act
def assignCols(self): # Load source and target columns respectively srcCols = self._source_columns() for c in srcCols: srcItem = QListWidgetItem(c, self.lstSrcFields) srcItem.setCheckState(Qt.Unchecked) srcItem.setIcon(GuiUtils.get_icon("column.png")) self.lstSrcFields.addItem(srcItem) # Destination Columns tabIndex = int(self.field("tabIndex")) self.targetTab = self.destCheckedItem.text() targetCols = table_column_names(self.targetTab, False, True) # Remove geometry columns in the target columns list for gc in self.geomcols: colIndex = getIndex(targetCols, gc) if colIndex != -1: targetCols.remove(gc) # Remove 'id' column if there id_idx = getIndex(targetCols, 'id') if id_idx != -1: targetCols.remove('id') self._add_target_table_columns(targetCols)
def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.btn_add_value_field.setIcon(GuiUtils.get_icon('add.png')) self.btn_reset_value_fields.setIcon(GuiUtils.get_icon('reset.png')) self._value_config_widgets = OrderedDict() # Connect signals self.btn_add_value_field.clicked.connect( self.on_add_value_config_widget) self.tb_value_config.tabCloseRequested.connect( self._on_tab_close_requested) self.btn_reset_value_fields.clicked.connect(self.clear)
def action(self): tb_act = QAction( GuiUtils.get_icon("composer_table.png"), QApplication.translate("TableConfig", "Add attribute table"), self.mainWindow()) return tb_act
def action(self): manageTemplatesAct = QAction( GuiUtils.get_icon("manage_templates.png"), QApplication.translate("ManageTemplatesConfig", "Manage document templates"), self.mainWindow()) return manageTemplatesAct
def action(self): saveTemplateAct = QAction( GuiUtils.get_icon("save_tb.png"), QApplication.translate("SaveTemplateConfig", "Save document template"), self.mainWindow()) return saveTemplateAct
def action(self): openTemplateAct = QAction( GuiUtils.get_icon("open_file.png"), QApplication.translate("OpenTemplateConfig", "Open document template"), self.mainWindow()) return openTemplateAct
def __init__(self, parent=None, file_identifier=""): QMdiSubWindow.__init__(self, parent) self.setWindowIcon(GuiUtils.get_icon("photo.png")) self._file_identifier = file_identifier self._view_widget = None self.mdi_area = parent self.doc_width = None self.doc_height = None
def loadSourceTables(self): # Load all STDM tables self.lstSrcTab.clear() # tables = pg_tables() tables = profile_user_tables(self.curr_profile, True, True, sort=True) for t in tables.keys(): tabItem = QListWidgetItem(t, self.lstSrcTab) tabItem.setIcon(GuiUtils.get_icon("table.png")) self.lstSrcTab.addItem(tabItem)
def _add_entity(self, entity): # Add entity item to view item = QStandardItem( GuiUtils.get_icon('table.png'), entity.short_name ) item.setCheckable(True) item.setCheckState(Qt.Unchecked) self._model.appendRow(item)
def __init__(self, composerWrapper, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.btnAddField.setIcon(GuiUtils.get_icon('add.png')) self.btnClear.setIcon(GuiUtils.get_icon('reset.png')) self._composerWrapper = composerWrapper self._editorMappings = {} # Load fields if the data source has been specified self._ds_name = self._composerWrapper.selectedDataSource() self._load_fields() # Connect signals self._composerWrapper.dataSourceSelected.connect( self.on_data_source_changed) self.btnAddField.clicked.connect(self.on_add_column_styler_widget) self.btnClear.clicked.connect(self.on_clear_tabs)
def __init__(self, item: StdmMapLayoutItem, parent=None): super().__init__(parent) self.setupUi(self) self._item = item self._layout = item.layout() self.btnAddField.setIcon(GuiUtils.get_icon('add.png')) self.btnClear.setIcon(GuiUtils.get_icon('reset.png')) self._editorMappings = {} # Load fields if the data source has been specified self._ds_name = LayoutUtils.get_stdm_data_source_for_layout(self._layout) if self._ds_name is not None: self._loadFields() # Connect signals self._layout.variablesChanged.connect(self.layout_variables_changed) self.btnAddField.clicked.connect(self.on_add_column_styler_widget) self.btnClear.clicked.connect(self.on_clear_tabs)
def __init__(self, parent=None, State=VIEW): QWidget.__init__(self, parent) self.setupUi(self) self.btnRemove.setIcon(GuiUtils.get_icon('remove.png')) self.btnClear.setIcon(GuiUtils.get_icon('reset.png')) self.btnAdd.setIcon(GuiUtils.get_icon('add.png')) self._defaultEditTriggers = self.tvAdminUnits.editTriggers() self._state = State self._onStateChange() self._notifBar = NotificationBar(self.vlNotification) # Configure validating line edit controls # invalidMsg = "{} already exists." # self.txtUnitCode.setModelAttr(AdminSpatialUnitSet,"Code") # self.txtUnitCode.setInvalidMessage(invalidMsg) # self.txtUnitCode.setNotificationBar(self._notifBar) ''' Initialize formatter for the rendering the admin unit nodes and insert the root node into the tree view model. ''' self._adminUnitNodeFormatter = AdminUnitFormatter( self.tvAdminUnits, self) self._rtNode = self._adminUnitNodeFormatter.rootNode self._adminUnitTreeModel = STRTreeViewModel( self._adminUnitNodeFormatter.root(), view=self.tvAdminUnits) self.tvAdminUnits.setModel(self._adminUnitTreeModel) self.tvAdminUnits.hideColumn(2) self.tvAdminUnits.setColumnWidth(0, 220) self.tvAdminUnits.expandAll() # Connects slots self.btnAdd.clicked.connect(self.onCreateAdminUnit) self.btnClear.clicked.connect(self.onClearSelection) self.btnRemove.clicked.connect(self.onDeleteSelection) self._adminUnitTreeModel.dataChanged.connect(self.onModelDataChanged)
def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) self.btn_add_value_field.setIcon(GuiUtils.get_icon('add.png')) self.btn_reset_value_fields.setIcon(GuiUtils.get_icon('reset.png')) self._value_config_widgets = OrderedDict() # Connect signals self.btn_add_value_field.clicked.connect( self.on_add_value_config_widget) self.tb_value_config.tabCloseRequested.connect( self._on_tab_close_requested) self.btn_reset_value_fields.clicked.connect(self.clear) self._changed_blocked = False self.cbo_x_field.currentTextChanged.connect(self._on_changed) self.txt_x_label.textChanged.connect(self._on_changed) self.txt_y_label.textChanged.connect(self._on_changed)
def __init__(self, plugin): QDialog.__init__(self, plugin.iface.mainWindow()) self.setupUi(self) QgsGui.enableAutoGeometryRestore(self) self.tbUserRole.setTabIcon(0, GuiUtils.get_icon('user.png')) self.tbUserRole.setTabIcon(1, GuiUtils.get_icon('roles.png')) self.tbUserRole.setTabIcon(2, GuiUtils.get_icon('user_mapping.png')) # Initialize the dialog self.initGui() # Load users self.loadUsers() # Load Roles self.loadRoles() # Load user mappings self.loadUserMappings() # Reference to the currently selected STDM role for which user mappings need to be defined self.currentRole = None
def loadTables(self, type): # Load textual or spatial tables self.lstDestTables.clear() tables = None if type == "textual": tables = profile_user_tables(self.curr_profile, False, True) elif type == "spatial": tables = profile_spatial_tables(self.curr_profile) if tables is not None: for t in tables: tabItem = QListWidgetItem(t, self.lstDestTables) tabItem.setCheckState(Qt.Unchecked) tabItem.setIcon(GuiUtils.get_icon("table.png")) self.lstDestTables.addItem(tabItem)
def __init__(self, parent=None, iface=None): QTabWidget.__init__(self, parent) self.setupUi(self) self.setTabIcon(0, GuiUtils.get_icon('local.png')) self.setTabIcon(1, GuiUtils.get_icon('web.png')) self._notif_bar = None self._ol_loaded = False self._overlay_layer = None self.sel_highlight = None self.memory_layer = None self._db_session = STDMDb.instance().session self.set_iface(iface) # Web config self._web_spatial_loader = WebSpatialLoader(self.spatial_web_view, self) # Connect signals self._web_spatial_loader.loadError.connect( self.on_spatial_browser_error) self._web_spatial_loader.loadProgress.connect( self.on_spatial_browser_loading) self._web_spatial_loader.loadFinished.connect( self.on_spatial_browser_finished) self._web_spatial_loader.zoomChanged.connect( self.on_map_zoom_level_changed) self.rbGMaps.toggled.connect(self.on_load_GMaps) self.rbOSM.toggled.connect(self.on_load_OSM) self.zoomSlider.sliderReleased.connect(self.on_zoom_changed) self.btnResetMap.clicked.connect(self.on_reset_web_map) self.btnSync.clicked.connect(self.on_sync_extents) QgsProject.instance().layersWillBeRemoved.connect( self._on_overlay_to_be_removed)
def __init__(self, parent=None): QWizard.__init__(self, parent) self.setupUi(self) self.btnSrcUp.setIcon(GuiUtils.get_icon('up.png')) self.btnSrcDown.setIcon(GuiUtils.get_icon('down.png')) self.btn_add_translator.setIcon(GuiUtils.get_icon('add.png')) self.btn_edit_translator.setIcon(GuiUtils.get_icon('edit.png')) self.btn_delete_translator.setIcon(GuiUtils.get_icon('remove.png')) self.btnDestUp.setIcon(GuiUtils.get_icon('up.png')) self.btnDestDown.setIcon(GuiUtils.get_icon('down.png')) self.curr_profile = current_profile() # Connect signals self.btnBrowseSource.clicked.connect(self.setSourceFile) self.lstDestTables.itemClicked.connect(self.destSelectChanged) self.btnSrcUp.clicked.connect(self.srcItemUp) self.btnSrcDown.clicked.connect(self.srcItemDown) self.btnSrcAll.clicked.connect(self.checkSrcItems) self.btnSrcNone.clicked.connect(self.uncheckSrcItems) self.btnDestUp.clicked.connect(self.targetItemUp) self.btnDestDown.clicked.connect(self.targetItemDown) self.lstSrcFields.currentRowChanged[int].connect(self.sourceRowChanged) self.lstTargetFields.currentRowChanged[int].connect(self.destRowChanged) self.lstTargetFields.currentRowChanged[int].connect(self._enable_disable_trans_tools) self.chk_virtual.toggled.connect(self._on_load_virtual_columns) self.button_save_configuration.clicked.connect(self._save_column_mapping) self.button_load_configuration.clicked.connect(self._load_column_mapping) self.targetTab = '' self.import_was_successful = False self.restored_config = {} # Data Reader self.dataReader = None # Init self.registerFields() # Geometry columns self.geom_cols = [] # Initialize value translators from definitions self._init_translators() # self._set_target_fields_stylesheet() if os.path.exists(BACKUP_IMPORT_CONFIG_PATH): self._restore_previous_configuration()
def __init__(self, iface, access_templates, parent=None, plugin=None): QDialog.__init__(self, parent) self.setupUi(self) self.btnSelectTemplate.setIcon(GuiUtils.get_icon('document.png')) self._iface = iface self.plugin = plugin self._docTemplatePath = "" self._outputFilePath = "" self.curr_profile = current_profile() self.last_data_source = None self._config_mapping = OrderedDict() self._notif_bar = NotificationBar(self.vlNotification) self._doc_generator = DocumentGenerator(self._iface, self) self._data_source = "" self.access_templates = access_templates enable_drag_sort(self.lstDocNaming) # Configure generate button generateBtn = self.buttonBox.button(QDialogButtonBox.Ok) if not generateBtn is None: generateBtn.setText( QApplication.translate("DocumentGeneratorDialog", "Generate")) # Load supported image types supportedImageTypes = QImageWriter.supportedImageFormats() for imageType in supportedImageTypes: imageTypeStr = imageType.data().decode() self.cboImageType.addItem(imageTypeStr) self._init_progress_dialog() # Connect signals self.btnSelectTemplate.clicked.connect(self.onSelectTemplate) self.buttonBox.accepted.connect(self.onGenerate) self.chkUseOutputFolder.stateChanged.connect( self.onToggledOutputFolder) self.rbExpImage.toggled.connect(self.onToggleExportImage) self.tabWidget.currentChanged.connect(self.on_tab_index_changed) self.chk_template_datasource.stateChanged.connect( self.on_use_template_datasource) self.btnShowOutputFolder.clicked.connect(self.onShowOutputFolder)
def _init_gui(self): self._gl = QGridLayout(self) self._label = QLabel(self) self._label.setText(self.tr('Select document type')) self._gl.addWidget(self._label, 0, 0, 1, 1) self._cbo_doc_type = QComboBox(self) self._gl.addWidget(self._cbo_doc_type, 0, 1, 1, 1) self._btn_add_document = QPushButton(self) doc_ico = GuiUtils.get_icon('document.png') self._btn_add_document.setIcon(doc_ico) self._btn_add_document.setText(self.tr('Add document...')) self._btn_add_document.setMaximumWidth(200) self._gl.addWidget(self._btn_add_document, 0, 2, 1, 1) self._doc_tab_container = QTabWidget(self) self._gl.addWidget(self._doc_tab_container, 1, 0, 1, 3) self.setMinimumHeight(140)