def paintEvent(self, pe): painter = QPainter(self) painter.save() gradient = QLinearGradient() gradient.setStart(self._grad_start) gradient.setFinalStop(self._grad_end) gradient.setColorAt(0, QColor(230, 230, 230)) gradient.setColorAt(1, QColor(247, 247, 247)) brush = QBrush(gradient) painter.setBrush(brush) pen = QPen(Qt.black) pen.setWidth(1) painter.setPen(pen) painter.drawPath(self._painter_path) painter.restore() font = QFont() font.setFamily("Tahoma") font.setPixelSize(11) font.setBold(True) pen = QPen(Qt.darkGray) painter.setPen(pen) painter.setFont(font) self_rect = QRect(self.rect()) self_rect.moveTo(self._hor_margin, self._ver_margin // 2) painter.drawText(self_rect, Qt.AlignLeft, self._text)
class MonoFont: def __init__(self, name, size): self.font = QFont(name, size) self.font.setKerning(False) self.ascent = int(QFontMetricsF(self.font).ascent()) self.charWidth = QFontMetricsF(self.font).width("X") self.charHeight = int(QFontMetricsF(self.font).height()) self.charOffset = 0 # can introduce extra linespacing here self.bold = QFont(self.font) self.bold.setBold(True) self.under = QFont(self.font) self.under.setUnderline(True) # align character width properly if self.charWidth % 1.0 < 0.5: adjust = -(self.charWidth % 1.0) else: adjust = 1.0 - (self.charWidth % 1.0) self.charWidth += adjust self.font.setLetterSpacing(QFont.AbsoluteSpacing, adjust) self.bold.setLetterSpacing(QFont.AbsoluteSpacing, adjust) self.under.setLetterSpacing(QFont.AbsoluteSpacing, adjust)
def paintEvent(self, pe): painter = QPainter(self) painter.save() gradient = QLinearGradient() gradient.setStart(self._grad_start) gradient.setFinalStop(self._grad_end) gradient.setColorAt(0, QColor(230, 230, 230)) gradient.setColorAt(1, QColor(247, 247, 247)) brush = QBrush(gradient) painter.setBrush(brush) pen = QPen(Qt.black) pen.setWidth(1) painter.setPen(pen) painter.drawPath(self._painter_path) painter.restore() font = QFont() font.setFamily("Tahoma") font.setPixelSize(11) font.setBold(True) pen = QPen(Qt.darkGray) painter.setPen(pen) painter.setFont(font) self_rect = QRect(self.rect()) self_rect.moveTo(self._hor_margin, self._ver_margin // 2) painter.drawText(self_rect, Qt.AlignLeft, self._text)
def paintEvent(self, event): """ Paints the widgets: - paints the background - paint each visible blocks that intersects the widget bbox. """ painter = QPainter(self) painter.fillRect(event.rect(), self.back_brush) painter.setPen(self.text_pen) painter.setFont(self.font) w = self.width() - 2 # better name lookup speed painter_drawText = painter.drawText align_right = Qt.AlignRight normal_font = painter.font() normal_font.setBold(False) bold_font = QFont(normal_font) bold_font.setBold(True) active = self.editor.codeEdit.textCursor().blockNumber() for vb in self.editor.codeEdit.visible_blocks: row = vb.row if row == active + 1: painter.setFont(bold_font) else: painter.setFont(normal_font) painter_drawText(0, vb.top, w, vb.height, align_right, str(row)) return Panel.paintEvent(self, event)
def setReset(self, m): self.pushButton_2 = QPushButton("Reset it") font = QFont() font.setPointSize(17) font.setWeight(75) font.setBold(True) self.pushButton_2.setFont(font) self.pushButton_2.clicked.connect(self.setbut_reset) m.addWidget(self.pushButton_2)
def font(bold): """ Returns a `QFont` object to be used in `View` derived classes. :param bold: Indicates whether or not the font will be bold """ font = QFont(View.fontFamily, 9, 50, False) font.setBold(bold) return font
def font(bold): """ Returns a `QFont` object to be used in `View` derived classes. :param bold: Indicates whether or not the font will be bold """ font = QFont(View.fontFamily, 9, 50, False) font.setBold(bold) return font
def __init__(self, txt=None): super(ConfigTableHeaderItem, self).__init__(txt) # first we customize the appearance self.setTextAlignment(Qt.AlignCenter) this_font = QFont() this_font.setBold(True) this_font.setPointSize(7) self.setBackground(QBrush(Qt.white)) self.setFont(this_font) self.setForeground(Qt.black) self.setFlags(Qt.ItemIsEnabled) return
def __init__(self, parent=None): super(AutoInfo, self).__init__(parent) self.setupUi(self) # Remove the question mark widget from dialog # self.setWindowFlags(self.windowFlags() ^ # Qt.WindowContextHelpButtonHint) self.setWindowFlags(Qt.Tool | Qt.FramelessWindowHint) self.hide() font = QFont() font.setBold(True) font.setPointSize(QFont.pointSize(QFont()) + 3) self.label.setFont(font)
def __CreateGrid(self): g1 = QGridLayout() self.centralWidget().setLayout(g1) g1.setSpacing(5) bold = QFont() bold.setBold(True) self.__AddGridLabel(g1, 'Source Directory:', QFont(), 0, 0, -1) self.__AddGridLabel(g1, 'Archive Directory:', QFont(), 1, 0, -1) self.__AddGridLabel(g1, 'Target Directory:', QFont(), 2, 0, -1) self.__AddGridLabel(g1, 'Max Number of Videos:', QFont(), 3, 0, -1) self.__AddGridLabel(g1, 'Video File Types:', QFont(), 3, 2, -1) #self.__AddGridLabel(g1, 'Max Run Time in Hours:', QFont(), 4, 2, -1) g1.addWidget(self.qleSourceDir, 0, 1, 1, 3) g1.addWidget(self.qleArchiveDir, 1, 1, 1, 3) g1.addWidget(self.qleDestinationDir, 2, 1, 1, 3) g1.addWidget(self.qleMaxVidsCap, 3, 1) g1.addWidget(self.qleVideoTypes, 3, 3) #g1.addWidget(self.qleRunTimeMax, 4, 3) g1.addWidget(self.qpbRun, 10, 3, alignment = -1) g1.addWidget(QLabel('', self), 4, 0,) # Empty Column As Separator g1.addWidget(QLabel('', self), 5, 0,) # Empty Column As Separator self.__AddGridLabel(g1, 'Videos Completed:', bold, 5, 0, -1) self.__AddGridLabel(g1, 'Start Time:', bold, 5, 2, -1) self.__AddGridLabel(g1, 'Videos In Progress:', bold, 6, 0, -1) self.__AddGridLabel(g1, 'Time Remaining:', bold, 7, 2, -1) self.__AddGridLabel(g1, 'Target Space Left:', bold, 7, 0, -1) self.__AddGridLabel(g1, 'Archive Space Left:', bold, 8, 0, -1) self.__AddGridLabel(g1, 'End Time:', bold, 6, 2, -1) self.__AddGridLabel(g1, 'Processing Speed:', bold, 8, 2, -1) g1.addWidget(self.qlVidsDone, 5, 1,) g1.addWidget(self.qlVidsInProgress, 6, 1) g1.addWidget(self.qlStartTime, 5, 3,) g1.addWidget(self.qlEndTime, 6, 3,) g1.addWidget(self.qlTimeLeft, 7, 3,) g1.addWidget(self.qlDestinationSpace, 7, 1,) g1.addWidget(self.qlArcSpace, 8, 1,) g1.addWidget(self.qlProcessingSpeed, 8, 3,) g1.addWidget(self.qpbSourceDir, 0, 4,) g1.addWidget(self.qpbArchiveDir, 1, 4,) g1.addWidget(self.qpbTargetDir, 2, 4,) self.show
def __init__(self, txt, value, tooltip=None): super(ConfigTableItem, self).__init__(txt) self.__value = value # first we customize the appearance self.setTextAlignment(Qt.AlignCenter) this_font = QFont() this_font.setBold(False) this_font.setPointSize(7) self.setBackground(QBrush(Qt.white)) self.setFont(this_font) self.setForeground(Qt.black) if tooltip is not None: self.setToolTip(tooltip) # self.setFlags(Qt.ItemIsEnabled | Qt.ItemIsDragEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable) self.setFlags(Qt.ItemIsSelectable) return
def setheader(self): font = QFont(u'微软雅黑', 12) font.setBold(True) self.table.horizontalHeader().setFont(font) # 设置表头字体 self.table.setColumnWidth(0, 50) self.table.setColumnWidth(1, 50) self.table.setColumnWidth(3, 100) self.table.horizontalHeader().setSectionResizeMode( 2, QHeaderView.Stretch) self.table.horizontalHeader().setStyleSheet( 'QHeaderView::section{background:gray}') self.table.horizontalHeader().setFixedHeight(50) self.table.setColumnHidden(0, True) self.btn_set_header.setStyleSheet('background-color:lightblue') self.settext( u'设置标头字体及字号,隐藏ID列,设置标头除姓名外全部为固定宽度\n,设置姓名列自动扩展宽度,设置标头行高,设置标头背景色')
def buildLabels(self, label): self.label = QLabel(label) self.data = QLabel(constants.DEFAULT_LABEL) # Center the text in the labels self.label.setAlignment(Qt.AlignCenter) self.data.setAlignment(Qt.AlignCenter) # Bold the label label labelFont = QFont() labelFont.setBold(True) # Make the data label font obnoxiously large dataFont = QFont() dataFont.setPixelSize(20) self.label.setFont(labelFont) self.data.setFont(dataFont)
def buildLabels(self, label): self.label = QLabel(label) self.data = QLabel(constants.DEFAULT_LABEL) # Center the text in the labels self.label.setAlignment(Qt.AlignCenter) self.data.setAlignment(Qt.AlignCenter) # Bold the label label labelFont = QFont() labelFont.setBold(True) # Make the data label font obnoxiously large dataFont = QFont() dataFont.setPixelSize(20) self.label.setFont(labelFont) self.data.setFont(dataFont)
def firstPage(self): for i in range( self.mainLayout.count() ): item = self.mainLayout.itemAt(0) item.widget().setParent( None ) title = QLabel( "<p style='color:rgb( 137,129,120 )'>Welcome to the PingoTools Installer</p>" ) title.setFixedHeight( 50 ) titleFont = QFont() titleFont.setPixelSize( 18 ) titleFont.setBold( True ) titleFont.setFamily( "Helvetica [Cronyx]" ) title.setAlignment( QtCore.Qt.AlignCenter ) title.setFont( titleFont ) description = QLabel() description.setAlignment( QtCore.Qt.AlignCenter ) buttonsWidget = QWidget(); buttonsWidget.setMaximumHeight( 50 ) buttonsLayout = QHBoxLayout( buttonsWidget ) emptyArea = QLabel() buttonNext = QPushButton( 'Next > ' ) buttonCancel = QPushButton( 'Cancel' ) buttonsLayout.addWidget( emptyArea ) buttonsLayout.addWidget( buttonNext ); buttonNext.setFixedWidth( 100 ) buttonsLayout.addWidget( buttonCancel ); buttonCancel.setFixedWidth( 100 ) self.mainLayout.addWidget( title ) self.mainLayout.addWidget( description ) self.mainLayout.addWidget( buttonsWidget ) origWidth = 500 frontImage = QImage() frontImage.load( os.path.dirname( __file__ ) + '/images/pingoTools_main.jpg' ) trValue = QTransform().scale( float(origWidth)/frontImage.width(), float(origWidth)/frontImage.width() ) transformedImage = frontImage.transformed( trValue ) pixmap = QPixmap.fromImage( transformedImage ) description.setPixmap( pixmap ) description.setGeometry( 0,0, transformedImage.width() , transformedImage.height() ) description.paintEvent(QPaintEvent(QtCore.QRect( 0,0,self.width(), self.height() ))) QtCore.QObject.connect( buttonNext, QtCore.SIGNAL( 'clicked()' ), self.secondPage ) QtCore.QObject.connect( buttonCancel, QtCore.SIGNAL( 'clicked()' ), self.cmd_cancel )
def setMW(self, ml): ll = QVBoxLayout() self.mIcon = QLabel() self.mIcon.setAlignment(Qt.AlignCenter) mmicon = self.logo.pixmap(250, 230, QIcon.Active, QIcon.On) self.mIcon.setPixmap(mmicon) self.mInst = QLabel( "<center>(Drag and drop files or folders to encrypt them)<br>" + "(Drap and drop .sld file to decrypt it)<br>" + "<u>2GB max single file size to encrypt</u></center>") font = QFont() font.setPointSize(13) font.setBold(True) font.setWeight(75) self.fInst = QLabel('<center>| Double-Click for about |</center>') self.mInst.setFont(font) ll.addWidget(self.mIcon) ll.addWidget(self.mInst) ll.addWidget(self.fInst) ml.addLayout(ll)
def setMW(self, ml): ll = QVBoxLayout() self.mIcon = QLabel() self.mIcon.setAlignment(Qt.AlignCenter) mmicon = self.logo.pixmap(250, 230, QIcon.Active, QIcon.On) self.mIcon.setPixmap(mmicon) self.mInst = QLabel( # u"<center>(Drag and drop files or folders to encrypt them)<br>" + u"<center>(마우스로 끌어다 놓으십시오)<br>" + u"<u>최대 2GB 파일 또는 디렉토리만 가능</u></center>") font = QFont() font.setPointSize(13) font.setBold(True) font.setWeight(75) self.fInst = QLabel('<center></center>') self.mInst.setFont(font) ll.addWidget(self.mIcon) ll.addWidget(self.mInst) ll.addWidget(self.fInst) ml.addLayout(ll)
def tag_image(source, dest, tag, font, fontsize, x, y, width, height, aspectx, aspecty, red, green, blue, bold=False, italic=False): """docstring for tag_image""" app = QApplication.instance() pixmap = QPixmap(source) color = QColor(red,green,blue) font = QFont(font) font.setPixelSize(int(fontsize*pixmap.height())) font.setItalic(italic) font.setBold(bold) painter = QPainter(pixmap) painter.setPen(color) painter.setFont(font); painter.drawText(x*pixmap.width(),y*pixmap.height(), tag) painter.end() # Resize and save return pixmap.toImage().scaled(width*aspectx, height*aspecty, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation).scaled(width, height, Qt.IgnoreAspectRatio, Qt.SmoothTransformation).save(dest)
def setObjectText(self, strng): """ TOWRITE :param `strng`: TOWRITE :type `strng`: QString """ self.objText = strng textPath = QPainterPath() font = QFont() font.setFamily(self.objTextFont) font.setPointSizeF(self.objTextSize) font.setBold(self.objTextBold) font.setItalic(self.objTextItalic) font.setUnderline(self.objTextUnderline) font.setStrikeOut(self.objTextStrikeOut) font.setOverline(self.objTextOverline) textPath.addText(0., 0., font, strng) # Translate the path based on the justification. jRect = textPath.boundingRect() # QRectF if self.objTextJustify == "Left": textPath.translate(-jRect.left(), 0) elif self.objTextJustify == "Center": textPath.translate(-jRect.center().x(), 0) elif self.objTextJustify == "Right": textPath.translate(-jRect.right(), 0) elif self.objTextJustify == "Aligned": pass # TODO: TextSingleObject Aligned Justification elif self.objTextJustify == "Middle": textPath.translate(-jRect.center()) elif self.objTextJustify == "Fit": pass # TODO: TextSingleObject Fit Justification elif self.objTextJustify == "Top Left": textPath.translate(-jRect.topLeft()) elif self.objTextJustify == "Top Center": textPath.translate(-jRect.center().x(), -jRect.top()) elif self.objTextJustify == "Top Right": textPath.translate(-jRect.topRight()) elif self.objTextJustify == "Middle Left": textPath.translate(-jRect.left(), -jRect.top() / 2.0) elif self.objTextJustify == "Middle Center": textPath.translate(-jRect.center().x(), -jRect.top() / 2.0) elif self.objTextJustify == "Middle Right": textPath.translate(-jRect.right(), -jRect.top() / 2.0) elif self.objTextJustify == "Bottom Left": textPath.translate(-jRect.bottomLeft()) elif self.objTextJustify == "Bottom Center": textPath.translate(-jRect.center().x(), -jRect.bottom()) elif self.objTextJustify == "Bottom Right": textPath.translate(-jRect.bottomRight()) # Backward or Upside Down. if self.objTextBackward or self.objTextUpsideDown: horiz = 1.0 # qreal vert = 1.0 # qreal if self.objTextBackward: horiz = -1.0 if self.objTextUpsideDown: vert = -1.0 flippedPath = QPainterPath() element = QPainterPath.Element P2 = QPainterPath.Element P3 = QPainterPath.Element P4 = QPainterPath.Element for i in range(0, textPath.elementCount( )): # for(int i = 0; i < textPath.elementCount(); ++i) element = textPath.elementAt(i) if element.isMoveTo(): flippedPath.moveTo(horiz * element.x, vert * element.y) elif element.isLineTo(): flippedPath.lineTo(horiz * element.x, vert * element.y) elif element.isCurveTo(): # start point P1 is not needed P2 = textPath.elementAt(i) # control point P3 = textPath.elementAt(i + 1) # control point P4 = textPath.elementAt(i + 2) # end point flippedPath.cubicTo(horiz * P2.x, vert * P2.y, horiz * P3.x, vert * P3.y, horiz * P4.x, vert * P4.y) objTextPath = flippedPath else: objTextPath = textPath # Add the grip point to the shape path. gripPath = objTextPath # QPainterPath gripPath.connectPath(objTextPath) gripPath.addRect(-0.00000001, -0.00000001, 0.00000002, 0.00000002) self.setObjectPath(gripPath)
class Bar(QToolBar): clicked = Signal(str) def __init__(self, orientation=Qt.Horizontal, parent=None): super().__init__(parent) self.setOrientation(orientation) policy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed, QSizePolicy.ButtonBox) policy.setHeightForWidth(True) policy.setWidthForHeight(True) self.setSizePolicy(policy) self.setFloatable(False) self.setToolTip("""<p><b>Goto Letter</b></p> <p>Left-click a letter to navigate to the first entry starting with that letter.</p> <p>Right-click a letter to navigate to the first entry starting with the most recently left-clicked letter, plus any subsequent right-clicked letters, and this letter.</p> <p>(One left-click or a fifth right-click clears the previous letters.)</p> <p>For example, left-click <i>S</i> to go to the first “s” entry. Then right-click <i>A</i> to go to the first “sa” entry, then right-click <i>T</i> to go to the first “sat” entry.</p>""") self.timer = QTimer(self) self.timer.setSingleShot(True) self.timer.timeout.connect(self.onTimeout) size = self.font().pointSizeF() strategy = QFont.StyleStrategy(QFont.PreferOutline | QFont.PreferAntialias | QFont.PreferQuality) self.mainFont = QFont("courier new") self.mainFont.setFixedPitch(True) self.mainFont.setStyleStrategy(strategy) self.mainFont.setStyleHint(QFont.Monospace) self.mainFont.setPointSizeF(size * 1.5) self.mainFont.setBold(True) self.mainFont.setItalic(False) self.setFont(self.mainFont) self.smallFont = QFont("helvetica") self.smallFont.setStyleStrategy(strategy) self.smallFont.setStyleHint(QFont.Times) self.smallFont.setPointSizeF(size * 1.25) self.smallFont.setBold(False) self.smallFont.setItalic(False) self.letters = string.ascii_uppercase self.word = None def sizeHint(self): return self.minimumSizeHint() def minimumSizeHint(self): count = len(self.letters) widthAll = self.fontMetrics().width(self.letters) * H_GAP_PC widthW = self.fontMetrics().width("WW") heightOne = self.fontMetrics().height() if self.orientation == Qt.Vertical: return QSize(widthW, (heightOne * count) + HANDLE_OFFSET) return QSize(widthAll + HANDLE_OFFSET, heightOne * V_GAP_PC) def paintEvent(self, event): super().paintEvent(event) letterPen = QPen(Qt.darkGreen if self.isEnabled() else Qt.lightGray) wordPen = QPen(Qt.darkCyan if self.isEnabled() else Qt.lightGray) painter = QPainter(self) painter.setRenderHints(QPainter.TextAntialiasing) painter.setPen(letterPen) heightOne = self.fontMetrics().height() widthOne = self.fontMetrics().width("W") if self.orientation == Qt.Vertical: y = HANDLE_OFFSET for c in self.letters: rect = QRectF(X_OFFSET, y, widthOne, heightOne) painter.drawText(rect, Qt.AlignCenter, c) y += heightOne if self.word is not None: painter.setFont(self.smallFont) painter.setPen(wordPen) rect = self.rect().adjusted(0, HANDLE_OFFSET, -widthOne / 3, 0) painter.drawText(rect, Qt.AlignTop | Qt.AlignRight | Qt.TextWordWrap, "\n".join(self.word.lower())) painter.setPen(letterPen) painter.setFont(self.mainFont) else: widthOne *= H_GAP_PC x = HANDLE_OFFSET for c in self.letters: rect = QRectF(x, 0, widthOne, heightOne * V_GAP_PC) painter.drawText(rect, Qt.AlignCenter, c) x += widthOne if self.word is not None: painter.setFont(self.smallFont) painter.setPen(wordPen) rect = self.rect().adjusted(HANDLE_OFFSET, 0, 0, 0) painter.drawText(rect, Qt.AlignBottom | Qt.AlignLeft, self.word.lower()) painter.setPen(letterPen) painter.setFont(self.mainFont) def mousePressEvent(self, event): if self.orientation == Qt.Vertical: if event.y() < HANDLE_OFFSET: event.ignore() return heightOne = self.fontMetrics().height() i = clamp(0, int((event.y() - HANDLE_OFFSET) / heightOne), len(self.letters) - 1) else: if event.x() < HANDLE_OFFSET: event.ignore() return widthOne = self.fontMetrics().width("W") * H_GAP_PC i = clamp(0, int((event.x() - HANDLE_OFFSET) / widthOne), len(self.letters) - 1) event.accept() word = self.letters[i] if event.button() == Qt.LeftButton or self.word is None: self.word = word elif event.button() == Qt.RightButton: if len(self.word) >= 4: self.word = word elif self.word is not None: self.word += word if self.word is not None: self.clicked.emit(self.word.lower()) self.timer.start(10000) self.update() def contextMenuEvent(self, event): if ((self.orientation == Qt.Vertical and event.y() < HANDLE_OFFSET) or (self.orientation == Qt.Horizontal and event.x() < HANDLE_OFFSET)): event.ignore() else: event.accept() def setOrientation(self, orientation): self.orientation = orientation self.update() def heightForWidth(self, width): count = len(self.letters) heightOne = self.fontMetrics().height() widthAll = self.fontMetrics().width(self.letters) * H_GAP_PC if widthAll > width: # Needs to be vertical return heightOne * count return heightOne * V_GAP_PC # Needs to be horizontal def onTimeout(self): self.timer.stop() if self.word is not None: self.word = None self.update()
class PostViewWidget(HorsePanel): def __init__(self, parent, order_overview_widget, find_order_slot): global configuration super(PostViewWidget, self).__init__(parent) self.set_panel_title(_("Post overview")) self.bold_font = QFont(self.font()) self.bold_font.setBold(True) self.nb_cols = 8 # Number of columns in the operation definition table self.order_overview_widget = order_overview_widget self.button = QPushButton(_("Refresh"), self) self.button.clicked.connect(self.refresh_action) self.sort_by_deadline_button = QRadioButton(_("By deadline"), self) self.sort_by_deadline_button.toggled.connect(self.sort_by_deadline) self.sort_by_size_button = QRadioButton(_("By hours left to do"), self) self.sort_by_size_button.toggled.connect(self.sort_by_size) # hlayout = QHBoxLayout() # hlayout.setObjectName("halyout") # hlayout.setContentsMargins(0,0,0,0) # hlayout.addWidget(self.sort_by_deadline_button) # hlayout.addWidget(self.sort_by_size_button) # hlayout.addWidget(self.button) # hlayout.addStretch() self.navbar = NavBar(self, [(self.sort_by_deadline_button, None), (self.sort_by_size_button, None), (self.button, None), (_("Find"), find_order_slot)]) self.navbar.buttons[3].setObjectName("specialMenuButton") self.vlayout = QVBoxLayout(self) self.vlayout.setObjectName("Vlayout") self.vlayout.addWidget( TitleWidget(_("Posts Overview"), self, self.navbar)) self._table_model = QStandardItemModel(1, self.nb_cols, self) self.table_view = QTableView(None) self.table_view.setModel(self._table_model) self.table_view.selectionModel().currentChanged.connect( self.operation_selected) self.table_view.verticalHeader().hide() self.table_view.horizontalHeader().hide() self.table_view.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table_view.setSelectionBehavior(QAbstractItemView.SelectRows) # This forces Qt to expand layout once I fill data in # FIXME dirty but I really don't get why setting # the mini width to something smaller (that happens at # startup, on first refresh) doesn't work self.table_view.setMinimumWidth(1) self.table_view.setMaximumWidth(1) self.post_view_scene = PostViewScene(self, order_overview_widget) self.post_view_scene_view = QGraphicsView(self) self.post_view_scene_view.setScene(self.post_view_scene) self.post_view_scene_view.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.splitter = QSplitter(Qt.Horizontal) self.splitter.addWidget( SubFrame(_("Posts"), self.table_view, self.splitter)) self.splitter.addWidget( SubFrame(_("Workload"), self.post_view_scene_view, self.splitter)) # self.splitter.setStretchFactor(0,1) self.splitter.setStretchFactor(1, 1) self.vlayout.addWidget(self.splitter) # hlayout = QHBoxLayout() # hlayout.addWidget(SubFrame(_("Posts"),self.table_view,self)) # hlayout.addWidget(SubFrame(_("Workload"),self.post_view_scene_view,self)) # hlayout.setStretch(1,1) # self.vlayout.addLayout(hlayout) self.vlayout.setStretch(0, 0) self.vlayout.setStretch(1, 1) self.setLayout(self.vlayout) self.timer = QTimer(self) self.timer.timeout.connect(self.slidePostsScene) self.current_view_y = 0 def _data_load(self): global dao all_operations = dao.operation_dao.load_all_operations_ready_for_production( ) operation_definitions = dao.operation_definition_dao.all_direct_frozen( ) return operation_definitions, all_operations def _reset_operation_definitions(self, operations): self._table_model.setColumnCount(1) self._table_model.setRowCount(len(operations)) # BUG This should be refreshed on reload() too row = col = 0 first_active = None for opdef in operations: if opdef.operation_definition_id in self.post_view_scene.drawn_operations_data: # currently total planned time t = self.post_view_scene.drawn_operations_data[ opdef.operation_definition_id] ndx = self._table_model.index(row, col) if not first_active: first_active = ndx self._table_model.setData( ndx, u"{} {}".format(opdef.description, t), Qt.DisplayRole) # self._table_model.setData(ndx,self.bold_font,Qt.FontRole) self._table_model.setData(self._table_model.index(row, col), opdef.operation_definition_id, Qt.UserRole) row += 1 else: pass # self._table_model.setData(self._table_model.index(row,col),opdef.description,Qt.DisplayRole) # = col + 1 # if col == self.nb_cols: # col = 0 # row += 1 self._table_model.setRowCount(row) # self.table_view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) # self.vlayout.setStretch(0,0) # self.vlayout.setStretch(1,10) # self.vlayout.setStretch(2,10000) # height = 0 # for c in range(self.table_view.model().rowCount()): # height += self.table_view.rowHeight(c) + 1 # +1 for cell border # self.table_view.setMinimumHeight(height) # self.table_view.setMaximumHeight(height) for i in range(self.nb_cols): self.table_view.resizeColumnToContents(i) self.table_view.setMaximumWidth(self.table_view.columnWidth(0)) self.table_view.setMinimumWidth(self.table_view.columnWidth(0)) self.table_view.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred) self.table_view.update() self.splitter.update() return first_active def slide_to_operation(self, opdef_id): if opdef_id in self.post_view_scene.posts_offsets: self.slide_target_opdef_id = opdef_id # mainlog.debug("Target y = {}".format(self.post_view_scene.posts_offsets[self.slide_target_opdef])) self.timer.start(20) @Slot() def slidePostsScene(self): if self.slide_target_opdef_id is None: return # self.post_view_scene_view self.post_view_scene.set_cursor_on( self.slide_target_opdef_id ) # This done here also aviod some screen trashing v = self.post_view_scene_view.verticalScrollBar().value() # mainlog.debug( "slidePostsScene : {}".format(v)) r = self.post_view_scene.posts_offsets[self.slide_target_opdef_id] target_y = r.y() + r.height() / 2 delta = (target_y - self.current_view_y) * 0.4 self.current_view_y = self.current_view_y + delta self.post_view_scene_view.centerOn(0, self.current_view_y) # mainlog.debug( "slidePostsScene : {} / {}".format(target_y, self.current_view_y)) if self.post_view_scene_view.verticalScrollBar().value() == v: # Close enough => stop moving # FIXME not correct because we must stop when the view stops moving, not when the goal we set for centerOn is reached self.timer.stop() @Slot(QModelIndex, QModelIndex) def operation_selected(self, ndx_cur, ndx_old): if ndx_cur.isValid(): opdef = self._table_model.data(ndx_cur, Qt.UserRole) if opdef: self.slide_to_operation( self._table_model.data(ndx_cur, Qt.UserRole)) @Slot() def refresh_action(self): # FIXME reload operations as well operation_definitions, all_operations = self._data_load() # mainlog.debug("reload") if self.sort_by_deadline_button.isChecked(): self.post_view_scene.reload(self, operation_definitions, all_operations, 1) elif self.sort_by_size_button.isChecked(): self.post_view_scene.reload(self, operation_definitions, all_operations, 2) else: self.post_view_scene.reload(self, operation_definitions, all_operations, 0) # mainlog.debug("reset") first_active = self._reset_operation_definitions(operation_definitions) # self.table_view.selectionModel().currentChanged.connect(self.operation_selected) if first_active: self.table_view.setCurrentIndex(first_active) # mainlog.debug("done reset") @Slot(bool) def sort_by_deadline(self, checked): if checked: self.refresh_action() @Slot(bool) def sort_by_size(self, checked): if checked: self.refresh_action() order_part_double_clicked = Signal(int) # Callback that will be called by HooverBar def set_on_order_part(self, order_part_id): self.order_part_double_clicked.emit(order_part_id)
def initUI(self): """Met en place les éléments de l'interface.""" # -+++++++------------------- main window -------------------+++++++- # self.setWindowTitle(u"Encodage / Décodage de Huffman") self.centerAndResize() centralwidget = QWidget(self) mainGrid = QGridLayout(centralwidget) mainGrid.setColumnMinimumWidth(0, 450) # -+++++++------------------ groupe analyse -----------------+++++++- # analysGroup = QGroupBox(u"Analyse", centralwidget) self.analysGrid = QGridLayout(analysGroup) # ----------- groupe de la table des codes ---------- # codeTableGroup = QGroupBox(u"Table des codes", analysGroup) codeTableGrid = QGridLayout(codeTableGroup) # un tableau pour les codes self.codesTableModel = MyTableModel() self.codesTable = QTableView(codeTableGroup) self.codesTable.setModel(self.codesTableModel) self.codesTable.setFont(QFont("Mono", 8)) self.codesTable.resizeColumnsToContents() self.codesTable.setSortingEnabled(True) codeTableGrid.addWidget(self.codesTable, 0, 0, 1, 1) self.analysGrid.addWidget(codeTableGroup, 1, 0, 1, 1) # ----------- label du ratio de compression ---------- # self.ratioLab = QLabel(u"Ratio de compression: ", analysGroup) font = QFont() font.setBold(True) font.setWeight(75) font.setKerning(True) self.ratioLab.setFont(font) self.analysGrid.addWidget(self.ratioLab, 2, 0, 1, 1) # -+++++++-------- groupe de la table de comparaison --------+++++++- # self.compGroup = QGroupBox(analysGroup) self.compGroup.setTitle(u"Comparaisons") compGrid = QGridLayout(self.compGroup) # un tableau pour le ratio self.compTable = QTableWidget(self.compGroup) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.compTable.sizePolicy().hasHeightForWidth()) self.compTable.setSizePolicy(sizePolicy) self.compTable.setBaseSize(QSize(0, 0)) font = QFont() font.setWeight(50) self.compTable.setFont(font) self.compTable.setEditTriggers(QAbstractItemView.NoEditTriggers) self.compTable.setShowGrid(True) self.compTable.setGridStyle(Qt.SolidLine) # lignes / colonnes self.compTable.setColumnCount(2) self.compTable.setRowCount(3) self.compTable.setVerticalHeaderItem(0, QTableWidgetItem("Taille (bits)")) self.compTable.setVerticalHeaderItem(1, QTableWidgetItem("Entropie")) self.compTable.setVerticalHeaderItem(2, QTableWidgetItem("Taille moy. (bits)")) for i in range(2): self.compTable.verticalHeaderItem(i).setTextAlignment( Qt.AlignRight) self.compTable.setHorizontalHeaderItem(0, QTableWidgetItem("ASCII")) self.compTable.setHorizontalHeaderItem(1, QTableWidgetItem("Huffman")) # nom des items self.compTabASCIIMem = QTableWidgetItem() self.compTable.setItem(0, 0, self.compTabASCIIMem) self.compTabASCIIEnt = QTableWidgetItem() self.compTable.setItem(1, 0, self.compTabASCIIEnt) self.compTabASCIIAvg = QTableWidgetItem() self.compTable.setItem(2, 0, self.compTabASCIIAvg) self.compTabHuffMem = QTableWidgetItem() self.compTable.setItem(0, 1, self.compTabHuffMem) self.compTabHuffEnt = QTableWidgetItem() self.compTable.setItem(1, 1, self.compTabHuffEnt) self.compTabHuffAvg = QTableWidgetItem() self.compTable.setItem(2, 1, self.compTabHuffAvg) # parem du tableau self.compTable.horizontalHeader().setCascadingSectionResizes(False) self.compTable.verticalHeader().setVisible(True) font = QFont("Mono", 8) self.compTable.setFont(font) compGrid.addWidget(self.compTable, 1, 0, 1, 1) self.analysGrid.addWidget(self.compGroup, 0, 0, 1, 1) mainGrid.addWidget(analysGroup, 0, 1, 1, 1) # -+++++++----------------- groupe du texte -----------------+++++++- # groupBox = QGroupBox(u"Texte", centralwidget) textGrid = QGridLayout(groupBox) # -+++++++------------- groupe du texte original ------------+++++++- # orgTextGroup = QGroupBox(u"Texte original (Ctrl+T)", groupBox) orgTextGrid = QGridLayout(orgTextGroup) self.orgText = QTextEdit(orgTextGroup) self.orgText.setPalette(self.defaultPalette) orgTextGrid.addWidget(self.orgText, 0, 0, 1, 1) textGrid.addWidget(orgTextGroup, 0, 0, 1, 2) # -+++++++------------ groupe du texte compressé ------------+++++++- # compressedTextGroup = QGroupBox(u"Texte compressé (Ctrl+H)", groupBox) compressedTextGrid = QGridLayout(compressedTextGroup) self.compressedText = QTextEdit(compressedTextGroup) self.compressedText.setPalette(self.defaultPalette) compressedTextGrid.addWidget(self.compressedText, 0, 0, 1, 1) textGrid.addWidget(compressedTextGroup, 1, 0, 1, 2) # -+++++++------------ groupe pour le texte ascii -----------+++++++- # asciiTextGroup = QGroupBox(u"Texte ASCII", groupBox) asciiTextGrid = QGridLayout(asciiTextGroup) self.asciiText = QTextBrowser(asciiTextGroup) self.asciiText.setPalette(self.defaultPalette) asciiTextGrid.addWidget(self.asciiText, 0, 0, 1, 1) textGrid.addWidget(asciiTextGroup, 2, 0, 1, 2) # -+++++++-------------------- label de log -----------------+++++++- # self.logLab = QLabel(analysGroup) textGrid.addWidget(self.logLab, 3, 0, 1, 2) # -+++++++----------- bouton pour encoder le texte ----------+++++++- # self.encodeBut = QPushButton(groupBox) self.encodeBut.setStatusTip( u"Cliquez sur ce bouton pour encoder le texte original.") self.encodeBut.setText(u"ENCODER") self.encodeBut.clicked.connect(self.encode_text) textGrid.addWidget(self.encodeBut, 4, 0, 1, 1) # -+++++++----------- bouton pour décoder le texte ----------+++++++- # self.decodeBut = QPushButton(groupBox) self.decodeBut.setStatusTip( u"Cliquez sur ce bouton pour décoder le texte compressé.") self.decodeBut.setText(u"DÉCODER") self.decodeBut.clicked.connect(self.decode_text) textGrid.addWidget(self.decodeBut, 4, 1, 1, 1) mainGrid.addWidget(groupBox, 0, 0, 1, 1) self.setCentralWidget(centralwidget) # -+++++++--------------- une barre de statut ---------------+++++++- # self.setStatusBar(QStatusBar(self)) # -+++++++--------------------- le menu ---------------------+++++++- # self.fileMenu = QMenu(u"Fichier") self.fileMenu.addAction(u"Importer un texte...", self.open_text) self.fileMenu.addAction( u"Importer un texte encodé...", lambda: self.open_text(True)) self.fileMenu.addAction(u"Importer un dictionnaire...", self.open_dict) self.fileMenu.addAction(u"Enregistrer le dictionnaire...", self.save_dict) self.fileMenu.addAction(u"Quitter", self.close) self.menuBar().addMenu(self.fileMenu) QMetaObject.connectSlotsByName(self)
class FoldPanel(Panel): """ This Panel display folding indicators and manage folding/unfolding a text The panel also handles line added/removed and update the indicators position automatically. .. note:: It does not parse the code to put fold indicators, this is the task of a code folder mode. Instead it provides an easy way for other modes to put fold indicators on the left margin. """ #: Panel identifier IDENTIFIER = "Folding" DESCRIPTION = "Display code folding indicators" def __init__(self, parent=None): Panel.__init__( self, self.IDENTIFIER, self.DESCRIPTION, parent) self.fold_indicators = [] self.setMouseTracking(True) self.logger = logging.getLogger( __name__ + "." + self.__class__.__name__) def addIndicator(self, start, end): """ Adds a fold indicator :param start: Start line (1 based) :param end: End line """ self.fold_indicators.append(FoldIndicator(start, end)) self.update() def removeIndicator(self, indicator): """ Remove a fold indicator :param indicator: Indicator to remove """ self.fold_indicators.remove(indicator) self.update() def clearIndicators(self): """ Remove all indicators """ self.fold_indicators[:] = [] self.update() def install(self, editor): """ Install the Panel on the editor """ Panel.install(self, editor) self.bc = self.editor.codeEdit.blockCount() self.__updateCursorPos() def _onStateChanged(self, state): Panel._onStateChanged(self, state) if state is True: self.editor.codeEdit.visibleBlocksChanged.connect(self.update) self.editor.codeEdit.blockCountChanged.connect(self.__onBlockCountChanged) self.editor.codeEdit.newTextSet.connect(self.__onNewTextSet) self.editor.codeEdit.keyPressed.connect(self.__updateCursorPos) else: self.editor.codeEdit.visibleBlocksChanged.disconnect(self.update) self.editor.codeEdit.blockCountChanged.disconnect(self.__onBlockCountChanged) self.editor.codeEdit.newTextSet.disconnect(self.__onNewTextSet) self.editor.codeEdit.keyPressed.disconnect(self.__updateCursorPos) def _onStyleChanged(self): """ Updates brushes and pens """ style = self.currentStyle self.font = QFont(self.currentStyle.fontName, 7) self.font.setBold(True) fm = QFontMetricsF(self.editor.codeEdit.font()) self.size_hint = QSize(16, 16) self.back_brush = QBrush(QColor(style.panelsBackgroundColor)) self.active_line_brush = QBrush(QColor(style.activeLineColor)) self.separator_pen = QPen(QColor(style.panelSeparatorColor)) self.normal_pen = QPen(QColor(style.lineNbrColor)) self.highlight_pen = QPen(QColor(style.tokenColor(Text))) self.repaint() def sizeHint(self): """ Returns a fixed size hint (16x16) """ self.size_hint = QSize(16, 16) return self.size_hint def __onNewTextSet(self): self.clearIndicators() def getIndicatorForLine(self, line): """ Returns the fold indicator whose start position equals the line :param line: Line nbr of the start position of the indicator to get. :return: FoldIndicator or None """ for m in self.fold_indicators: if m.start == line: return m return None def __updateCursorPos(self): """ Update tcPos and tcPosInBlock :return: """ self.tcPos = self.editor.codeEdit.textCursor().blockNumber() + 1 self.tcPosInBlock = self.editor.codeEdit.textCursor().positionInBlock() def __onBlockCountChanged(self, num=-1): """ Handles line added/removed event """ # a line has been inserted or removed tcPos = self.editor.codeEdit.textCursor().blockNumber() + 1 tcPosInBlock = self.editor.codeEdit.textCursor().positionInBlock() bc = self.bc if bc < num: self.__onLinesAdded(num - bc, tcPos, tcPosInBlock) else: self.__onLinesRemoved(bc - num, tcPos, tcPosInBlock) self.tcPosInBlock = self.tcPosInBlock self.bc = num def __onLinesAdded(self, nbLines, tcPos, tcPosInBlock): """ Offsets markers positions with the number of line added """ if self.tcPosInBlock > 0: self.tcPos += 1 # offset each line after the tcPos by nbLines for marker in self.fold_indicators: if marker.start >= self.tcPos: marker.start += nbLines if marker.end >= self.tcPos: marker.end += nbLines self.tcPos = tcPos self.tcPosInBlock = tcPosInBlock self.update() def __onLinesRemoved(self, nbLines, tcPos, tcPosInBlock): """ Offsets markers positions with the number of line removed """ for marker in self.fold_indicators: if marker.start >= self.tcPos: marker.start -= nbLines if marker.start < 1: self.removeIndicator(marker) if marker.end >= self.tcPos: marker.end -= nbLines if marker.end == marker.start: self.removeIndicator(marker) self.tcPos = tcPos self.tcPosInBlock = tcPosInBlock self.update() def paintEvent(self, event): """ Paints the widget """ if self.enabled is False: return Panel.paintEvent(self, event) painter = QPainter(self) painter.fillRect(event.rect(), self.back_brush) for vb in self.editor.codeEdit.visible_blocks: line = vb.row # paint marker for line marker = self.getIndicatorForLine(line) if marker is None: continue # use the normal pen to draw the fold indicator drawLines = False pen = self.normal_pen if marker.hover is True: pen = self.highlight_pen drawLines = True painter.setPen(pen) # get the text to draw txt = '-' if marker.folded is True: drawLines = False txt = '+' offset = 4 h = self.size_hint.height() fm = QFontMetricsF(self.editor.codeEdit.font()) hoffset = (fm.height() - h) / 2.0 r = QRect(vb.rect.x(), vb.rect.y() + hoffset, self.size_hint.width(), self.size_hint.height()) painter.setFont(self.font) painter.drawText(r, Qt.AlignVCenter | Qt.AlignHCenter, txt) w = self.size_hint.width() - 2 * offset h = self.size_hint.width() - 2 * offset hoffset = (fm.height() - h) / 2.0 r.setX(vb.rect.x() + offset) r.setY(vb.rect.y() + hoffset) r.setWidth(w) r.setHeight(h) painter.drawRect(r) if drawLines is True: top = (vb.rect.x() + self.size_hint.width() / 2.0, vb.rect.y() + hoffset + offset * 2) delta = ((marker.end - marker.start) * vb.height) # - (vb.rect.height() / 2.0) bottom = (top[0], top[1] + delta) painter.drawLine(top[0], top[1], bottom[0], bottom[1]) painter.drawLine(bottom[0], bottom[1], bottom[0] + self.size_hint.width() / 2.0, bottom[1]) return def leaveEvent(self, event): """ Clears indicator hover states and repaint """ for m in self.fold_indicators: m.hover = False self.repaint() def mouseMoveEvent(self, event): """ Detects indicator hover states """ if self.enabled is False: return pos = event.pos() y = pos.y() repaint = False for m in self.fold_indicators: if m.hover is True: m.hover = False repaint = True for vb in self.editor.codeEdit.visible_blocks: top = vb.top height = vb.height if top < y < top + height: marker = self.getIndicatorForLine(vb.row) if marker is not None: # mark it as hover and repaint marker.hover = True repaint = True if repaint is True: self.repaint() def mouseReleaseEvent(self, event): """ Folds/Unfolds code blocks """ if self.enabled is False: return pos = event.pos() y = pos.y() for vb in self.editor.codeEdit.visible_blocks: top = vb.top height = vb.height if top < y < top + height: marker = self.getIndicatorForLine(vb.row) if marker is not None: marker.folded = not marker.folded self.editor.codeEdit.fold(marker.start - 1, marker.end, marker.folded) self.repaint()
def setObjectText(self, strng): """ TOWRITE :param `strng`: TOWRITE :type `strng`: QString """ self.objText = strng textPath = QPainterPath() font = QFont() font.setFamily(self.objTextFont) font.setPointSizeF(self.objTextSize) font.setBold(self.objTextBold) font.setItalic(self.objTextItalic) font.setUnderline(self.objTextUnderline) font.setStrikeOut(self.objTextStrikeOut) font.setOverline(self.objTextOverline) textPath.addText(0., 0., font, strng) # Translate the path based on the justification. jRect = textPath.boundingRect() # QRectF if self.objTextJustify == "Left": textPath.translate(-jRect.left(), 0) elif self.objTextJustify == "Center": textPath.translate(-jRect.center().x(), 0) elif self.objTextJustify == "Right": textPath.translate(-jRect.right(), 0) elif self.objTextJustify == "Aligned": pass # TODO: TextSingleObject Aligned Justification elif self.objTextJustify == "Middle": textPath.translate(-jRect.center()) elif self.objTextJustify == "Fit": pass # TODO: TextSingleObject Fit Justification elif self.objTextJustify == "Top Left": textPath.translate(-jRect.topLeft()) elif self.objTextJustify == "Top Center": textPath.translate(-jRect.center().x(), -jRect.top()) elif self.objTextJustify == "Top Right": textPath.translate(-jRect.topRight()) elif self.objTextJustify == "Middle Left": textPath.translate(-jRect.left(), -jRect.top()/2.0) elif self.objTextJustify == "Middle Center": textPath.translate(-jRect.center().x(), -jRect.top()/2.0) elif self.objTextJustify == "Middle Right": textPath.translate(-jRect.right(), -jRect.top()/2.0) elif self.objTextJustify == "Bottom Left": textPath.translate(-jRect.bottomLeft()) elif self.objTextJustify == "Bottom Center": textPath.translate(-jRect.center().x(), -jRect.bottom()) elif self.objTextJustify == "Bottom Right": textPath.translate(-jRect.bottomRight()) # Backward or Upside Down. if self.objTextBackward or self.objTextUpsideDown: horiz = 1.0 # qreal vert = 1.0 # qreal if self.objTextBackward: horiz = -1.0 if self.objTextUpsideDown: vert = -1.0 flippedPath = QPainterPath() element = QPainterPath.Element P2 = QPainterPath.Element P3 = QPainterPath.Element P4 = QPainterPath.Element for i in range(0, textPath.elementCount()): # for(int i = 0; i < textPath.elementCount(); ++i) element = textPath.elementAt(i) if element.isMoveTo(): flippedPath.moveTo(horiz * element.x, vert * element.y) elif element.isLineTo(): flippedPath.lineTo(horiz * element.x, vert * element.y) elif element.isCurveTo(): # start point P1 is not needed P2 = textPath.elementAt(i) # control point P3 = textPath.elementAt(i + 1) # control point P4 = textPath.elementAt(i + 2) # end point flippedPath.cubicTo(horiz * P2.x, vert * P2.y, horiz * P3.x, vert * P3.y, horiz * P4.x, vert * P4.y) objTextPath = flippedPath else: objTextPath = textPath # Add the grip point to the shape path. gripPath = objTextPath # QPainterPath gripPath.connectPath(objTextPath) gripPath.addRect(-0.00000001, -0.00000001, 0.00000002, 0.00000002) self.setObjectPath(gripPath)