def addSignalFunction(channel, signalFunction, plot=None, color=None, wrap=True, label=None): if plot is None: plot = getPlot() if plot is None: plot = addPlot() if color is not None: rgb = [int(c * 255) for c in color] color = QtGui.QColor(*rgb) else: color = QtGui.QColor() if wrap: def _signalFunction(x): t, v = signalFunction(x) return t * 1e-6, float(v) else: _signalFunction = signalFunction _mainWindow.addPythonSignal( plot, [channel, _signalFunction, label or signalFunction.__doc__, color])
def _setupTextureColors(self): # custom colors for non-textured robotiq hand for name in self.model.getLinkNames(): strs = name.split('_') if len(strs) >= 2 and strs[0] in ['left', 'right'] and strs[1] in ('finger', 'palm') or name.endswith('hand_force_torque'): self.model.setLinkColor(name, QtGui.QColor(90, 90, 90) if strs[1] == 'finger' else QtGui.QColor(20,20,20)) else: self.model.setLinkColor(name, QtGui.QColor(255,255,255))
def _setupTextureColors(self): # custom colors for non-textured robotiq hand for name in self.model.getLinkNames(): strs = name.split("_") if (len(strs) >= 2 and strs[0] in ["left", "right"] and strs[1] in ("finger", "palm") or name.endswith("hand_force_torque")): self.model.setLinkColor( name, QtGui.QColor(90, 90, 90) if strs[1] == "finger" else QtGui.QColor(20, 20, 20), )
def __init__(self, name, geom, polyData, parentTransform): self.polyDataItem = vis.PolyDataItem(name, polyData, view=None) self.polyDataItem.setProperty('Alpha', geom.color[3]) self.polyDataItem.actor.SetTexture(Geometry.TextureCache.get( Geometry.getTextureFileName(polyData) )) if self.polyDataItem.actor.GetTexture(): self.polyDataItem.setProperty('Color', QtGui.QColor(255, 255, 255)) else: self.polyDataItem.setProperty('Color', QtGui.QColor(geom.color[0]*255, geom.color[1]*255, geom.color[2]*255)) if USE_SHADOWS: self.polyDataItem.shadowOn()
def __init__(self, name, itemRow, itemCul, exportDir=None): super(xTableItem ,self).__init__() label = QtGui.QLabel(name).text self.setText(label) self.itemRow = itemRow self.itemCul = itemCul if self.itemCul == 4: self.col = QtGui.QColor(10, 100, 100) else: self.col = QtGui.QColor(0, 0, 0) #set background color self.setBackground(self.col)
def showClusterObjects(clusters, parent): colors = [ QtCore.Qt.red, QtCore.Qt.blue, QtCore.Qt.yellow, QtCore.Qt.green, QtCore.Qt.magenta, QtCore.Qt.cyan, QtCore.Qt.darkCyan, QtCore.Qt.darkGreen, QtCore.Qt.darkMagenta ] colors = [QtGui.QColor(c) for c in colors] colors = [(c.red()/255.0, c.green()/255.0, c.blue()/255.0) for c in colors] objects = [] for i, cluster in enumerate(clusters): name = 'object %d' % i color = colors[i % len(colors)] clusterObj = showPolyData(cluster.mesh, name, color=color, parent=parent, alpha=1.0) clusterFrame = showFrame(cluster.frame, name + ' frame', scale=0.2, visible=False, parent=clusterObj) clusterBox = showPolyData(cluster.box, name + ' box', color=color, parent=clusterObj, alpha=0.6, visible=False) clusterPoints = showPolyData(cluster.points, name + ' points', color=color, parent=clusterObj, visible=False, alpha=1.0) clusterPoints.setProperty('Point Size', 7) clusterPoints.colorBy(None) objects.append(clusterObj) for obj in [clusterObj, clusterBox, clusterPoints]: obj.actor.SetUserTransform(cluster.frame) return objects
def updatePolyDataItemProperties(self, polyDataItem): polyDataItem._updateColorByProperty() polyDataItem.setProperty('Alpha', self.color[3]) polyDataItem.actor.SetTexture( Geometry.TextureCache.get( Geometry.getTextureFileName(self.polyData))) if polyDataItem.actor.GetTexture(): polyDataItem.setProperty('Color', QtGui.QColor(255, 255, 255)) else: polyDataItem.setProperty( 'Color', QtGui.QColor(*(255 * np.asarray(self.color[:3])))) if USE_SHADOWS: polyDataItem.shadowOn()
def mesh_to_K(gate_obj, ssv_id, tree_id, obj_type, color): mesh = gate_obj.syconn_gate.get_ssv_obj_mesh_from_results_store( ssv_id, obj_type) if len(mesh[0]) > 0: KnossosModule.skeleton.add_tree_mesh(tree_id, mesh[1], mesh[2], mesh[0], [], 4, False) KnossosModule.skeleton.set_tree_color(tree_id, QtGui.QColor(*color))
def __init__(self, frameProvider): vis.PolyDataItem.__init__(self, 'spindle axis', vtk.vtkPolyData(), view=None) self.frameProvider = frameProvider self.timer = TimerCallback() self.timer.callback = self.update self.setProperty('Color', QtGui.QColor(0, 255, 0)) self.setProperty('Visible', False)
def _updateModelColor(self): if self.getProperty('Color Mode') == 0: # Solid Color color = QtGui.QColor(*[c * 255 for c in self.getProperty('Color')]) self.model.setColor(color) elif self.getProperty('Color Mode') == 1: # Textures self._setupTextureColors() elif self.getProperty('Color Mode') == 2: # URDF Colors self.model.setUrdfColors()
def __init__(self): super(dlg_copyMetricBinding, self).__init__() # - Init self.srcGlyphBounds = {} # - Combos # -- Mode of operation self.cmb_mode = QtGui.QComboBox() self.cmb_mode.addItems(['Active Layer', 'All Master Layers']) # -- Flag color slector self.cmb_flag = QtGui.QComboBox() colorNames = QtGui.QColor.colorNames() for i in range(len(colorNames)): self.cmb_flag.addItem(colorNames[i]) self.cmb_flag.setItemData(i, QtGui.QColor(colorNames[i]), QtCore.Qt.DecorationRole) self.cmb_flag.setCurrentIndex(colorNames.index('lime')) # - Buttons self.btn_copy = QtGui.QPushButton('&Copy Expressions') self.btn_paste = QtGui.QPushButton('&Paste Expressions') self.btn_export = QtGui.QPushButton('&Export to File') self.btn_import = QtGui.QPushButton('&Import from File') self.btn_importFLC = QtGui.QPushButton('&Import from .FLC') self.btn_copy.clicked.connect(self.copyExpr) self.btn_paste.clicked.connect(self.pasteExpr) self.btn_export.clicked.connect(self.exportExpr) self.btn_import.clicked.connect(self.importExpr) self.btn_importFLC.clicked.connect(self.importExprFLC) self.btn_paste.setEnabled(False) #self.btn_export.setEnabled(False) #self.btn_import.setEnabled(False) # - Build layouts layoutV = QtGui.QVBoxLayout() layoutV.addWidget( QtGui.QLabel('Copy/Paste metric expressions to/from:')) layoutV.addWidget(self.cmb_mode) #layoutV.addWidget(QtGui.QLabel('Mark modified glyphs with:')) #layoutV.addWidget(self.cmb_flag) layoutV.addWidget(self.btn_copy) layoutV.addWidget(self.btn_paste) layoutV.addWidget(self.btn_export) layoutV.addWidget(self.btn_import) layoutV.addWidget(self.btn_importFLC) # - Set Widget self.setLayout(layoutV) self.setWindowTitle('%s %s' % (app_name, app_version)) self.setGeometry(300, 300, 220, 120) self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # Always on top!! self.show()
def toQProperty(propertyName, propertyValue): if 'color' in propertyName.lower() and isinstance(propertyValue, (list, tuple)) and len(propertyValue) == 3: return QtGui.QColor(propertyValue[0]*255.0, propertyValue[1]*255.0, propertyValue[2]*255.0) elif isinstance(propertyValue, np.float): return float(propertyValue) elif isinstance(propertyValue, (list, tuple, np.ndarray)) and len(propertyValue) and isinstance(propertyValue[0], np.float): return [float(x) for x in propertyValue] else: return propertyValue
def spawnBoardAffordance(self, randomize=False): self.boardLength = 1.5 if randomize: position = [ random.uniform(0.5, 0.8), random.uniform(-0.2, 0.2), random.uniform(0.5, 0.8) ] rpy = [ random.choice((random.uniform(-35, 35), random.uniform(70, 110))), random.uniform(-10, 10), random.uniform(-5, 5) ] zwidth = random.uniform(0.5, 1.0) else: if self.b.val: position = [0.4, 0.0, 1.] else: position = [0.6, 0.0, 1.] rpy = [90, 1, 0] zwidth = self.boardLength xwidth = 3.75 * .0254 ywidth = 1.75 * .0254 t = transformUtils.frameFromPositionAndRPY(position, rpy) t.Concatenate(self.b.computeGroundFrame(self.b.robotModel)) xaxis = [1, 0, 0] yaxis = [0, 1, 0] zaxis = [0, 0, 1] for axis in (xaxis, yaxis, zaxis): t.TransformVector(axis, axis) self.affordance = segmentation.createBlockAffordance( t.GetPosition(), xaxis, yaxis, zaxis, xwidth, ywidth, zwidth, 'board', parent='affordances') self.affordance.setProperty('Color', QtGui.QColor(200, 150, 100)) t = self.affordance.actor.GetUserTransform() self.frame = vis.showFrame(t, 'board frame', parent=self.affordance, visible=False, scale=0.2)
def mesh_loader(gate_obj, ssv_id, tree_id, obj_type, color): start = time.time() mesh = gate_obj.syconn_gate.get_ssv_obj_mesh(ssv_id, obj_type) print("Download time:", time.time() - start) start = time.time() if len(mesh[0]) > 0: KnossosModule.skeleton.add_tree_mesh(tree_id, mesh[1], mesh[2], mesh[0], [], 4, False) KnossosModule.skeleton.set_tree_color(tree_id, QtGui.QColor(*color)) print("Loading {}-mesh time (pure KNOSSOS): {:.2f} s".format( obj_type, time.time() - start))
def highlightLink(self, linkName, color): currentColor = self.robotModel.model.getLinkColor(linkName) if not currentColor.isValid(): return if linkName not in self.previousColors: self.previousColors[linkName] = currentColor alpha = self.robotModel.getProperty('Alpha') newColor = QtGui.QColor(color[0]*255, color[1]*255, color[2]*255, alpha*255) self.robotModel.model.setLinkColor(linkName, newColor)
def __init__(self, data): super(trTableView, self).__init__() # - Init self.flag_valueChanged = QtGui.QColor('powderblue') # - Set if data is not None: self.setTable(data) self.itemChanged.connect(self.markChange) # - Styling self.horizontalHeader().setStretchLastSection(True) self.setAlternatingRowColors(True) self.setShowGrid(False) self.setSortingEnabled(False) #self.resizeColumnsToContents() self.resizeRowsToContents()
def __init__(self, model, jointController, view): self.model = model self.jointController = jointController self.view = view self.colorNoHighlight = QtGui.QColor(190, 190, 190) self.colorHighlight = QtCore.Qt.red self.timer = TimerCallback() self.timer.callback = self.update self.timer.targetFps = 60 #self.timer.start() self.collisionStateIds = [] self.lastRobotStateMessage = None self.lastPlanMessage = None self.lastPlanCheckMessage = None lcmUtils.addSubscriber('EST_ROBOT_STATE', lcmdrc.robot_state_t, self.onRobotState) lcmUtils.addSubscriber('ROBOT_COLLISIONS', lcmdrc.robot_collision_array_t, self.onPlanCheck) lcmUtils.addSubscriber('CANDIDATE_MANIP_PLAN', lcmdrc.robot_plan_w_keyframes_t, self.onManipPlan) w = QtGui.QWidget() l = QtGui.QHBoxLayout(w) self.slider = QtGui.QSlider(QtCore.Qt.Horizontal) self.clearButton = QtGui.QPushButton('clear') self.zeroButton = QtGui.QPushButton('zero') l.addWidget(self.clearButton) l.addWidget(self.zeroButton) l.addWidget(self.slider) self.slider.connect(self.slider, 'valueChanged(int)', self.onSlider) self.slider.connect(self.zeroButton, 'clicked()', self.onZeroButtonClicked) self.slider.connect(self.clearButton, 'clicked()', self.onClearButtonClicked) ww = QtGui.QWidget() ll = QtGui.QVBoxLayout(ww) ll.addWidget(self.view) ll.addWidget(w) ll.setMargin(0) ww.show() ww.resize(800, 600) self.widget = ww
def onAtlasStepParams(self,msg): if (msg.desired_step_spec.foot_index ==1): is_right_foot = True else: is_right_foot = False #print msg.desired_step_spec.foot_index , " and " , is_right_foot foot = msg.desired_step_spec.foot footTransform = transformUtils.frameFromPositionAndRPY( foot.position , [0, 0, foot.yaw*180/math.pi]) mesh,color = self.getMeshAndColor(is_right_foot) #color[1] = 0.75 ; color[2] = 0.25 vis.updateFrame(footTransform, 'bdi foot', parent='foot placements', scale=0.2, visible=False) #bdi_step_mesh = om.findObjectByName('bdi step') #om.removeFromObjectModel(bdi_step_mesh) obj = vis.updatePolyData(mesh, 'bdi step', color=color, alpha=1.0, parent='foot placements', visible=False) obj.setProperty('Color',QtGui.QColor(color[0]*255.0,color[1]*255.0,color[2]*255.0)) obj.actor.SetUserTransform(footTransform)
def pasteAnchor(self): font = pFont() dst_glyphs = {glyph.name: glyph for glyph in font.pGlyphs()} print 'WARN:\t Pasting Glyph Anchors to Font:%s;' % font.name for glyph_name, layer_anchors in self.srcGlyphAnchors.iteritems(): if glyph_name in dst_glyphs: w_glyph = dst_glyphs[glyph_name] if self.cmb_mode.currentIndex == 1: # - All master layers for layer in w_glyph.masters(): if layer_anchors.has_key(layer.name): w_glyph.clearAnchors(layer.name) for anchor_name, anchor_pos in layer_anchors[ layer.name]: w_glyph.addAnchor(anchor_pos, anchor_name, layer.name) print 'PASTE MM:\t Glyph: /%s;\tLayer: %s.' % ( glyph_name, layer.name) else: print 'WARN:\t Glyph /%s - Layer %s not found!' % ( glyph_name, layer.name) else: # - Active Layer only w_glyph.clearAnchors() for anchor_name, anchor_pos in layer_anchors: w_glyph.addAnchor(anchor_pos, anchor_name) print 'PASTE:\t Glyph: /%s;\tLayer: %s.' % ( glyph_name, w_glyph.layer().name) if self.cmb_flag.currentText != 'None': w_glyph.setMark( QtGui.QColor(self.cmb_flag.currentText).hue()) else: print 'SKIP:\t Glyph /%s not found.' % glyph_name fl6.Update(CurrentFont())
def __init__(self): super(dlg_generateUnicode, self).__init__() self.n2u = {} # Insert your default folder for custom NAM files self.namFolder = r'' # Set to True if you want to keep Unicodes for glyphs not in the NAM self.keepUnicodes = True # Enter color flag integer if you want to flag modified glyphs, or None self.flagModified = 1 self.f = CurrentFont() self.fPath = self.f.path self.fFolder = os.path.dirname(self.fPath) self.fPathBase = os.path.splitext(os.path.basename(self.fPath))[0] self.fgnu = fontGlyphNameUnicodes(self.f) if not self.namFolder: if fl.userpath: self.namFolder = fl.userpath else: self.namFolder = self.fFolder # -- Flag color selector self.cmb_flag = QtGui.QComboBox() colorNames = QtGui.QColor.colorNames() for i in range(len(colorNames)): self.cmb_flag.addItem(colorNames[i]) self.cmb_flag.setItemData(i, QtGui.QColor(colorNames[i]), QtCore.Qt.DecorationRole) self.cmb_flag.insertItem(0, 'None') self.cmb_flag.setCurrentIndex(0) # - Options self.chk_keepUnicodes = QtGui.QCheckBox( 'Keep Unicodes for glyphs not in NAM') self.chk_keepUnicodes.setCheckState(QtCore.Qt.Checked) # - Buttons self.btn_open = QtGui.QPushButton('&Open NAM file') self.btn_open.clicked.connect(self.openNamFile) self.btn_save = QtGui.QPushButton('&Save NAM file') self.btn_save.clicked.connect(self.saveNamFile) self.btn_run = QtGui.QPushButton('&Generate Unicodes') self.btn_run.setEnabled(False) self.btn_run.clicked.connect(self.generateUnicodes) # - Build layouts layoutV = QtGui.QVBoxLayout() layoutV.addWidget(self.btn_open) layoutV.addWidget(QtGui.QLabel('Flag modified glyphs:')) layoutV.addWidget(self.cmb_flag) layoutV.addWidget(self.chk_keepUnicodes) layoutV.addWidget(self.btn_run) layoutV.addWidget(self.btn_save) # - Set Widget self.setLayout(layoutV) self.setWindowTitle('%s %s' % (app_name, __version__)) self.setGeometry(300, 300, 220, 120) self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # Always on top!! self.show()
def getColorFlag(self): if self.cmb_flag.currentText != 'None': return QtGui.QColor(self.cmb_flag.currentText).hue() else: return None
def __init__(self, uid, view, seed_pose, irisDriver, existing_region=None): d = DebugData() self.uid = uid vis.PolyDataItem.__init__(self, "IRIS region {:d}".format(uid), d.getPolyData(), view) self.transform = seed_pose d.addSphere((0, 0, 0), radius=0.02) self.seedObj = vis.showPolyData( d.getPolyData(), 'region seed', parent=om.getOrCreateContainer('IRIS region seeds')) self.seedObj.actor.SetUserTransform(self.transform) self.frameObj = vis.showFrame(self.transform, 'region seed frame', scale=0.2, visible=False, parent=self.seedObj) self.frameObj.setProperty('Edit', True) self.frameObj.widget.HandleRotationEnabledOff() terrain = om.findObjectByName('HEIGHT_MAP_SCENE') if terrain: rep = self.frameObj.widget.GetRepresentation() rep.SetTranslateAxisEnabled(2, False) rep.SetRotateAxisEnabled(0, False) rep.SetRotateAxisEnabled(1, False) pos = np.array(self.frameObj.transform.GetPosition()) polyData = filterUtils.removeNonFinitePoints(terrain.polyData) if polyData.GetNumberOfPoints(): polyData = segmentation.labelDistanceToLine( polyData, pos, pos + [0, 0, 1]) polyData = segmentation.thresholdPoints( polyData, 'distance_to_line', [0.0, 0.1]) if polyData.GetNumberOfPoints(): pos[2] = np.nanmax( vnp.getNumpyFromVtk(polyData, 'Points')[:, 2]) self.frameObj.transform.Translate( pos - np.array(self.frameObj.transform.GetPosition())) self.placer = PlacerWidget(view, self.seedObj, terrain) self.placer.start() else: self.frameObj.setProperty('Edit', True) self.frameObj.setProperty('Visible', True) self.driver = irisDriver self.safe_region = None self.addProperty('Visible', True) self.addProperty('Enabled for Walking', True) self.addProperty('Alpha', 1.0) self.addProperty('Color', QtGui.QColor(200, 200, 20)) self.frameObj.connectFrameModified(self.onFrameModified) if existing_region is None: self.onFrameModified(self.frameObj) else: self.setRegion(existing_region) self.setProperty('Alpha', 0.5) self.setProperty('Color', QtGui.QColor(220, 220, 220))
def __init__(self): super(dlg_copyMetrics, self).__init__() # - Init self.srcGlyphBounds = {} # - Combos # -- Mode of operation self.cmb_mode = QtGui.QComboBox() self.cmb_mode.addItems(['Active Layer', 'All Master Layers']) # -- Flag color slector self.cmb_flag = QtGui.QComboBox() colorNames = QtGui.QColor.colorNames() for i in range(len(colorNames)): self.cmb_flag.addItem(colorNames[i]) self.cmb_flag.setItemData(i, QtGui.QColor(colorNames[i]), QtCore.Qt.DecorationRole) self.cmb_flag.setCurrentIndex(colorNames.index('lime')) # - Buttons self.btn_copy = QtGui.QPushButton('&Copy Metric values') self.btn_pasteADV = QtGui.QPushButton( '&Paste Metric values: LSB, Advance') self.btn_pasteRSB = QtGui.QPushButton('&Paste Metric values: LSB, RSB') self.btn_export = QtGui.QPushButton('&Export to File (TypeRig *.json)') self.btn_import = QtGui.QPushButton( '&Import from File (TypeRig *.json)') self.btn_importAFM = QtGui.QPushButton( '&Import from Adobe Font Metrics (*.AFM)') self.btn_importAFM.setEnabled(False) self.btn_copy.clicked.connect(self.copyExpr) self.btn_pasteADV.clicked.connect(lambda: self.pasteExpr(sbMode=False)) self.btn_pasteRSB.clicked.connect(lambda: self.pasteExpr(sbMode=True)) self.btn_export.clicked.connect(self.exportExpr) self.btn_import.clicked.connect(self.importExpr) self.btn_importAFM.clicked.connect(self.importExprAFM) self.btn_pasteADV.setEnabled(False) self.btn_pasteRSB.setEnabled(False) #self.btn_export.setEnabled(False) #self.btn_import.setEnabled(False) # - Build layouts layoutV = QtGui.QVBoxLayout() layoutV.addWidget(QtGui.QLabel('Copy/Paste metrics to/from:')) layoutV.addWidget(self.cmb_mode) #layoutV.addWidget(QtGui.QLabel('Mark modified glyphs with:')) #layoutV.addWidget(self.cmb_flag) layoutV.addWidget(self.btn_copy) layoutV.addWidget(self.btn_pasteADV) layoutV.addWidget(self.btn_pasteRSB) layoutV.addWidget(self.btn_export) layoutV.addWidget(self.btn_import) layoutV.addWidget(self.btn_importAFM) # - Set Widget self.setLayout(layoutV) self.setWindowTitle('%s %s' % (app_name, app_version)) self.setGeometry(300, 300, 280, 140) self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # Always on top!! self.show()
def markChange(self, item): item.setBackground(QtGui.QColor('powderblue'))
def showClusterObjects(clusters, parent): colors = [ QtCore.Qt.red, QtCore.Qt.blue, QtCore.Qt.yellow, QtCore.Qt.green, QtCore.Qt.magenta, QtCore.Qt.cyan, QtCore.Qt.darkCyan, QtCore.Qt.darkGreen, QtCore.Qt.darkMagenta, ] colors = [QtGui.QColor(c) for c in colors] colors = [(c.red() / 255.0, c.green() / 255.0, c.blue() / 255.0) for c in colors] objects = [] for i, cluster in enumerate(clusters): name = "object %d" % i color = colors[i % len(colors)] clusterObj = showPolyData(cluster.mesh, name, color=color, parent=parent, alpha=1.0) clusterFrame = showFrame(cluster.frame, name + " frame", scale=0.2, visible=False, parent=clusterObj) clusterBox = showPolyData( cluster.box, name + " box", color=color, parent=clusterObj, alpha=0.6, visible=False, ) clusterPoints = showPolyData( cluster.points, name + " points", color=color, parent=clusterObj, visible=False, alpha=1.0, ) if hasattr(cluster, "oriented_frame"): orientedFrame = showFrame( cluster.oriented_frame, name + " oriented frame", scale=0.2, visible=False, parent=clusterObj, ) clusterPoints.setProperty("Point Size", 7) clusterPoints.colorBy(None) clusterObj.data = cluster objects.append(clusterObj) for obj in [clusterObj, clusterBox, clusterPoints]: obj.actor.SetUserTransform(cluster.frame) return objects
def getRobotBlueColor(): return QtGui.QColor(170, 255, 255)
def getRobotOrangeColor(): return QtGui.QColor(255, 190, 0)
def getRobotGrayColor(): return QtGui.QColor(177, 180, 190)
def _updateModelColor(self): if self.getProperty('Textures'): self._setupTextureColors() elif not self.useUrdfColors: color = QtGui.QColor(*[c*255 for c in self.getProperty('Color')]) self.model.setColor(color)
def setTable(self, data, data_check=[], reset=False): name_row, name_column = [], [] self.blockSignals(True) self.setColumnCount(max(map(len, data.values()))) self.setRowCount(len(data.keys())) # - Populate for n, layer in enumerate(sorted(data.keys())): name_row.append(layer) for m, key in enumerate(data[layer].keys()): # -- Build name column name_column.append(key) # -- Add first data column newitem = QtGui.QTableWidgetItem(str(data[layer][key])) if m == 0 else QtGui.QTableWidgetItem() # -- Selectively colorize missing data if m == 0 and len(data_check) and data[layer][key] not in data_check: newitem.setBackground(QtGui.QColor('red')) # -- Build Checkbox columns if m > 0: newitem.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) if m > 0: newitem.setCheckState(QtCore.Qt.Unchecked if not data[layer][key] else QtCore.Qt.Checked) self.setItem(n, m, newitem) self.setHorizontalHeaderLabels(name_column) self.setVerticalHeaderLabels(name_row) self.blockSignals(False)