def __init__(self, app, callback=None, input_placeholder='', function_box=False, flags=None, *args, **kwargs): super().__init__(flags, *args, **kwargs) layout = QVBoxLayout() self.app = app self.function_content = '' self.setContentsMargins(QMargins(0, 0, 0, 0)) layout.setContentsMargins(QMargins(0, 0, 0, 0)) self.list = QListWidget() self.list.setStyleSheet(''' QListWidget::item:hover { color: white; background-color: rgba(255, 255, 255, 5); } QListWidget::item:selected { color: white; background-color: rgba(255, 255, 255, 5); } ''') bar = QScrollBar() bar.setMaximumHeight(0) bar.setMaximumWidth(0) self.list.setHorizontalScrollBar(bar) self.list.model().rowsInserted.connect(self.on_row_inserted) layout.addWidget(self.list) box = QHBoxLayout() box.setContentsMargins(QMargins(3, 3, 3, 3)) if callback is not None: self.input = QConsoleInputWidget(self, callback) self.input.setPlaceholderText(input_placeholder) box.addWidget(self.input) if function_box: function_btn = QPushButton('ƒ') function_btn.setMinimumWidth(25) function_btn.clicked.connect(self.js_function_box) box.addWidget(function_btn) box_widget = QWidget() box_widget.setLayout(box) layout.addWidget(box_widget) self.setLayout(layout)
def __init__(self, app, flags=None, *args, **kwargs): super().__init__(flags, *args, **kwargs) layout = QVBoxLayout() self.app = app self.js_script = '' self.setContentsMargins(QMargins(0, 0, 0, 0)) layout.setContentsMargins(QMargins(0, 0, 0, 0)) self.list = QListWidget() self.list.setStyleSheet(''' QListWidget::item:hover { color: white; background-color: transparent; } QListWidget::item:selected { color: white; background-color: transparent; } ''') bar = QScrollBar() bar.setMaximumHeight(0) bar.setMaximumWidth(0) self.list.setHorizontalScrollBar(bar) self.list.model().rowsInserted.connect(self.on_row_inserted) layout.addWidget(self.list) js_box = QHBoxLayout() js_box.setContentsMargins(QMargins(3, 3, 3, 3)) self.input = JsInput(self) self.input.setPlaceholderText('$>') js_box.addWidget(self.input) function_btn = QPushButton('ƒ') function_btn.setMinimumWidth(25) function_btn.clicked.connect(self.js_function_box) js_box.addWidget(function_btn) js_box_widget = QWidget() js_box_widget.setLayout(js_box) layout.addWidget(js_box_widget) self.setLayout(layout)
class MyCodeEditor(QWidget): def __init__(self,parent=None): QWidget.__init__(self,parent) self.__editorSettings = EditorSettings() self.__textDocument = PythonTextDocument() self.__splitter = QSplitter(self) # 横纵滚动条 self.__verticalScrollBar = QScrollBar(self) self.__verticalScrollBar.adjustSize() self.__verticalScrollBar.setMinimumWidth(self.__verticalScrollBar.width()) self.__verticalScrollBar.setMaximumWidth(self.__verticalScrollBar.width()) self.__verticalScrollBar.valueChanged.connect(self.__onVScrollValueChanged) self.__editorSettings.startDisLineNumberChangedSignal.connect(self.__verticalScrollBar.setValue) self.__horizontalScrollBar = QScrollBar(QtCore.Qt.Horizontal,self) self.__horizontalScrollBar.adjustSize() self.__horizontalScrollBar.setMinimumHeight(self.__horizontalScrollBar.height()) self.__horizontalScrollBar.setMaximumHeight(self.__horizontalScrollBar.height()) self.__horizontalScrollBar.valueChanged.connect(self.__onHScrollValueChanged) self.__editorSettings.startDisLetterXOffChangedSignal.connect(self.__horizontalScrollBar.setValue) self.__lineNumberWidget = LineNumberWidget(self.__editorSettings,self.__splitter) setattr(self.__lineNumberWidget,'resizeEvent',self.__onLineNumberWidgetSizeChanged) self.__codeTextWidget = CodeTextWidget(self.__textDocument,self.__editorSettings,self.__splitter) self.__codeTextWidget.document().totalLevelTextChangedSignal.connect(self.__onCodeTextChanged) self.__codeTextWidget.settings().lineTextMaxPixelChangedSignal.connect(self.__onLineStrLengthChanged) self.__codeTextWidget.visibleLineYOffInfoChangedSignal.connect( self.__lineNumberWidget.setVisibleLineYOffInfoArray ) self.__splitter.addWidget( self.__lineNumberWidget ) self.__splitter.addWidget( self.__codeTextWidget ) self.__splitter.setCollapsible( 0,False ) self.__splitter.setCollapsible( 1,False ) self.setText = self.__codeTextWidget.setText self.getText = self.__codeTextWidget.getText def __onLineStrLengthChanged(self,newMaxLength): hMax = newMaxLength-1 self.__horizontalScrollBar.setRange(0,hMax) if self.__horizontalScrollBar.value() > hMax: self.__horizontalScrollBar.setValue(hMax) def __onCodeTextChanged(self,*arg1,**arg2): vMax = self.__codeTextWidget.document().getLineCount()-1 self.__verticalScrollBar.setRange(0,vMax) if self.__verticalScrollBar.value() > vMax: self.__verticalScrollBar.setValue(vMax) def __onVScrollValueChanged(self): self.__codeTextWidget.showLineNumberAsTop(self.__verticalScrollBar.value()) def __onHScrollValueChanged(self): self.__codeTextWidget.showLeftXOffAsLeft(self.__horizontalScrollBar.value()) def __onLineNumberWidgetSizeChanged(self,*arg1,**arg2): lineNumberWidgetWidth = self.__lineNumberWidget.width() vScrollBarWidth = self.__verticalScrollBar.width() hScrollBarHeight = self.__horizontalScrollBar.height() self.__horizontalScrollBar.setGeometry(lineNumberWidgetWidth,self.height()-hScrollBarHeight, \ self.width()-vScrollBarWidth-lineNumberWidgetWidth,hScrollBarHeight) def resizeEvent(self, event): vScrollBarWidth = self.__verticalScrollBar.width() hScrollBarHeight = self.__horizontalScrollBar.height() self.__splitter.setGeometry( 0,0,self.width()-vScrollBarWidth,self.height()-hScrollBarHeight ) self.__verticalScrollBar.setGeometry(self.width()-vScrollBarWidth,0,vScrollBarWidth,self.height()-hScrollBarHeight) self.__onLineNumberWidgetSizeChanged() def wheelEvent(self, event): changedV = 3 if event.angleDelta().y() < 0 else -3 self.__verticalScrollBar.setValue( self.__verticalScrollBar.value() + changedV )