class ScrollBar(QWidget): """ 定义一个可以变换样式的滚动条 """ def __init__(self, externalScrollBar=None, parent=None): super().__init__(parent) self.externalScrollBar = externalScrollBar # 实例化两个滚动条 self.minScrollBar = QScrollBar(Qt.Vertical, self) self.maxScrollBar = QScrollBar(Qt.Vertical, self) # 实例化一个控制滚动条显示的计时器 self.timer = QTimer(self) # 初始化 self.initWidget() self.associateScrollBar() self.setQss() def initWidget(self): """ 初始化小部件 """ self.setFixedWidth(20) self.minScrollBar.move(15, 0) self.maxScrollBar.hide() self.timer.setInterval(2000) self.timer.timeout.connect(self.showMinScrollBar) self.setAttribute(Qt.WA_TranslucentBackground) # 分配ID self.setObjectName('father') self.minScrollBar.setObjectName('minScrollBar') self.maxScrollBar.setObjectName('maxScrollBar') def adjustSrollBarHeight(self): """ 根据父级窗口的高度调整滚动条高度 """ if self.parent(): self.minScrollBar.setFixedHeight(self.parent().height() - 153) self.maxScrollBar.setFixedHeight(self.parent().height() - 153) def enterEvent(self, e: QEnterEvent): """ 鼠标进入界面时显示大滚动条并停止秒表 """ self.maxScrollBar.show() self.minScrollBar.hide() self.timer.stop() def leaveEvent(self, e): """ 鼠标离开打开秒表 """ self.timer.start() def showMinScrollBar(self): """ 定时溢出时隐藏大滚动条 """ self.timer.stop() self.maxScrollBar.hide() self.minScrollBar.show() def setQss(self): """ 设置层叠样式 """ with open(r'resource\css\my_scrollBar.qss', encoding='utf-8') as f: self.setStyleSheet(f.read()) def associateScrollBar(self): """ 关联滚动条 """ if self.externalScrollBar: # 设置最大值 self.minScrollBar.setMaximum(self.externalScrollBar.maximum()) self.maxScrollBar.setMaximum(self.externalScrollBar.maximum()) # 关联滚动条 self.externalScrollBar.valueChanged.connect( lambda: self.minScrollBar.setValue(self.externalScrollBar. value())) self.minScrollBar.valueChanged.connect(self.__minScrollBarChanged) self.maxScrollBar.valueChanged.connect( lambda: self.minScrollBar.setValue(self.maxScrollBar.value())) def __minScrollBarChanged(self): """ minScrollBar改变时同时改变另外两个滚动条的值 """ self.maxScrollBar.setValue(self.minScrollBar.value()) self.externalScrollBar.setValue(self.minScrollBar.value())
class MainUi(QMainWindow): obj_num = 0 container = {} def __init__(self, info): super(MainUi, self).__init__() self.icon = [ico for ico in info] self.column = len(self.icon) self.num = 10 # 界面头部展示模块数量 self.init_ui() def init_ui(self): self.setWindowIcon(QIcon('index.ico')) self.setWindowTitle("工具") self.resize(960, 600) self.statusBar().show() self._center() self.main_widget = QWidget() # 创建窗口主部件 self.main_layout = QGridLayout() # 创建主部件的网格布局 self.main_widget.setLayout(self.main_layout) # 设置窗口主部件布局为网格布局 # 创建上侧部件 self.up_widget = QWidget() self.up_widget.setObjectName('up_widget') self.up_widget.setFixedHeight(80) self.up_layout = QGridLayout() self.up_widget.setLayout(self.up_layout) # 创建滚动条 self.slide = QScrollBar(True) self.slide.setObjectName('slide_roll_bar') self.slide.setFixedHeight(const.SLIDE_HEIGHT) self.slide.setMaximum(self.column) self.slide.setMinimum(self.num) self.slide.valueChanged.connect(self._value_change) # 创建日志记录 # ************************************************## name = "Analysis" self.notice_btn = QPushButton(name) self.notice_btn.setObjectName(name) self.container["selectedNoticeName"] = name self.notice_btn.setFixedSize(const.NOTICE_WIDTH, const.BTN_HEIGHT) self.notice_btn.clicked.connect(self._clicked) self.notice_close_btn = QPushButton("✘") self.notice_close_btn.setObjectName("close_btn") self.notice_close_btn.setFixedSize(30, 30) self.notice_close_btn.setStyleSheet( """#close_btn{ background:red; border:none; margin-bottom: 20px; margin-left: 20px; } #close_btn:hover{ background:white; } """ ) self.notice_btn.setStyleSheet(""" #Analysis:hover#close_btn { background:red; } """) self.close_layout = QGridLayout() self.close_layout.addWidget(self.notice_close_btn) self.close_layout.setAlignment(Qt.AlignAbsolute|Qt.AlignRight) self.close_layout.setSpacing(0) self.notice_btn.setLayout(self.close_layout) # self.notice_btn.set(self.notice_close_btn) # ************************************************## # 创建中侧部件 self.mid_widget = QWidget() self.mid_widget.setObjectName('mid_widget') # self.mid_widget.setFixedHeight(400) self.mid_layout = QGridLayout() self.mid_widget.setLayout(self.mid_layout) # 创建下侧部件 self.down_widget = QWidget() self.down_widget.setObjectName('down_widget') self.down_widget.setFixedHeight(60) self.down_layout = QGridLayout() self.down_widget.setLayout(self.down_layout) self.main_layout.addWidget(self.up_widget, 0, 0, 1, self.column) self.main_layout.addWidget(self.slide, 1, 0, 1, self.column) self.main_layout.addWidget(self.notice_btn, 2, 0, 1, 1) self.main_layout.addWidget(self.mid_widget, 3, 1, 1, self.column - 1) self.main_layout.addWidget(self.down_widget, 4, self.column - 1, 1, 1) self.setCentralWidget(self.main_widget) # 生成analysis analysis = Analysis(self, name) self.container[name] = {"noticeName": name, "modelObj": analysis, "index": self.obj_num} self.container["selectedModelName"] = name # 创建头部(head) self.head_widget = QWidget() self.head_layout = QGridLayout() self.head_widget.setLayout(self.head_layout) self.load_model_ico(0, self.num) if self.num < self.column else self.load_model_ico(0, self.column) self.up_layout.addWidget(self.head_widget, 0, 0, 0, 0) # 创建中部 # 创建尾部 按钮 self.tail_btn = QPushButton("Execute") self.tail_btn.setObjectName('execute') self.tail_btn.setFixedSize(const.TAIL_HEIGHT, const.BTN_HEIGHT) self.tail_btn.clicked.connect(self.run) self.down_layout.addWidget(self.tail_btn, 0, 0, 0, 0) self.down_layout.setAlignment(Qt.AlignRight) # 展示进度条 self.progressBar = QProgressBar() self.progressBar.setFixedHeight(10) self.progressBar.setMaximum(const.HUNDRED) label = QLabel() label.setText("运行进度:") self.statusBar().addPermanentWidget(label) self.statusBar().addPermanentWidget(self.progressBar) self.main_layout.setSpacing(const.ZERO) set_style(self) # self.setWindowFlag(Qt.FramelessWindowHint) # 隐藏边框 # self.setWindowOpacity(0.9) # 设置窗口透明度 # self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明 def run(self): mode_name = self.container.get("selectedModelName", "") mode_info = self.container.get(mode_name, {}) mode = mode_info.get("modelObj") if not mode: print("error %s" % mode) return try: mode.run() except: self.set_progress() traceback.print_exc() def set_progress(self): self.tail_btn.setEnabled(True) def load_model_ico(self, start, end): for i in range(start, end): self.tool_btn = QToolButton() self.tool_btn.setText(f"{self.icon[i]}") # 设置按钮文本 self.tool_btn.setObjectName(f"{self.icon[i]}") # 设置按钮文本 self.tool_btn.setFixedSize(85, 52) # self.tool_btn.setFixedHeight(85) self.tool_btn.setIcon(qtawesome.icon(f'fa.{self.icon[i]}', color='white')) # 设置按钮图标 self.tool_btn.setIconSize(QSize(const.ICO_SIZE, const.ICO_SIZE)) # 设置图标大小 self.tool_btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) self.tool_btn.clicked.connect(self._clicked) self.head_layout.addWidget(self.tool_btn, 0, i, 1, 1) def info_btn(self, name): notice_btn = QPushButton(name) notice_btn.setObjectName(f"{name}_{self.obj_num}") notice_btn.setFixedSize(const.NOTICE_WIDTH, const.BTN_HEIGHT) self.container[name]["noticeName"] = f"{name}_{self.obj_num}" notice_btn.clicked.connect(self._clicked) self.main_layout.addWidget(notice_btn, 2, self.obj_num, 1, 1) def _clicked(self): model_name = self.sender().text() if model_name == self.container.get("selectedModelName"): self.show_widget(model_name) return # message.info() self.statusBar().showMessage(f'Current Value is {model_name}') model_info = self.container.get(model_name, {}) if not model_info: mode = None try: mode = ObjFactory.create(self, model_name) except: traceback.print_exc() # return # message.info() if mode is None: set_mid_widget_background_style(self.mid_widget, False) self.show_widget(model_name) print("failed") return # message.info() model_info["modelObj"] = mode self.obj_num += 1 model_info["index"] = self.obj_num self.container[model_name] = model_info self.info_btn(model_name) self.show_widget(model_name) self.show() @staticmethod def del_layout(layout): for i in range(layout.count()): layout.itemAt(i).widget().deleteLater() def show_widget(self, curr_mode_name): previous_name = self.container.get("selectedModelName") if previous_name is not None: index = self.container.get(previous_name).get("index") if index is not None: self.mid_layout.itemAt(index).widget().close() index = self.container.get(curr_mode_name, {}).get("index") if index is None: set_ico_style(self.head_widget, curr_mode_name) self.show_notice_widget(curr_mode_name) return self.mid_layout.itemAt(index).widget().show() self.show_notice_widget(curr_mode_name) set_mid_widget_background_style(self.mid_widget) set_ico_style(self.head_widget, curr_mode_name) self.container["selectedModelName"] = curr_mode_name print(f"当前Container:{self.container}") print(f"当前选中模块:{curr_mode_name}") def show_notice_widget(self, model_name): curr_notice_name = self.container.get(model_name, {}).get("noticeName", "failed-model") args = [] for key, item in self.container.items(): if not isinstance(item, dict): continue elif key == model_name: continue else: args.append(item.get("noticeName")) args.append(curr_notice_name) set_notice_style(self.main_widget, tuple(args)) self.container["selectedNoticeName"] = curr_notice_name def _value_change(self): value = self.slide.value() start = value - self.num self.statusBar().showMessage(f'Current Value is {value}') self.del_layout(self.head_layout) self.load_model_ico(start, value) def paintEvent(self, event): # 设置背景颜色 painter = QPainter(self) background_color = QColor() background_color.setNamedColor('#006CAB') painter.setBrush(background_color) painter.drawRect(self.rect()) def _center(self): # 窗口居中 screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
class MainUi(QMainWindow): def __init__(self): super(MainUi, self).__init__() self.icon = [ 'forward', 'sellsy', 'film', 'home', 'download', 'heart', 'comment', 'star', 'question', 'music', 'pause', 'backward' ] self.column = len(self.icon) self.num = 10 # 界面头部展示模块数量 self.row = 5 self.init_ui() def init_ui(self): self.setWindowIcon(QIcon('./img/index.ico')) self.setWindowTitle("工具") # self.setFixedSize(960, 700) self.resize(960, 700) # self._center() self.main_widget = QWidget() # 创建窗口主部件 self.main_layout = QGridLayout() # 创建主部件的网格布局 self.main_widget.setLayout(self.main_layout) # 设置窗口主部件布局为网格布局 # 创建上侧部件 self.up_widget = QWidget() self.up_widget.setObjectName('up_widget') self.up_widget.setFixedHeight(80) self.up_layout = QGridLayout() self.up_widget.setLayout(self.up_layout) # 创建滚动条 self.slide = QScrollBar(True) self.slide.setObjectName('slide_roll_bar') self.slide.setMaximum(self.column) self.slide.setMinimum(self.num) self.slide.valueChanged.connect(self._value_change) # 创建中侧部件 self.mid_widget = QWidget() self.mid_widget.setObjectName('mid_widget') self.mid_layout = QGridLayout() self.mid_widget.setLayout(self.mid_layout) # 创建下侧部件 self.down_widget = QWidget() self.down_widget.setObjectName('down_widget') self.down_layout = QGridLayout() self.down_widget.setLayout(self.down_layout) self.main_layout.addWidget(self.up_widget, 0, 0, 1, self.column) self.main_layout.addWidget(self.slide, 1, 0, 1, self.column) self.main_layout.addWidget(self.mid_widget, 2, 2, 1, self.column - 2) self.main_layout.addWidget(self.down_widget, 3, self.column - 1, self.row, 1) self.setCentralWidget(self.main_widget) # 创建头部(head) self.head_widget = QWidget() self.head_layout = QGridLayout() self.head_widget.setLayout(self.head_layout) self.load_model_ico( 0, self.num) if self.num < self.column else self.load_model_ico( 0, self.column) self.up_layout.addWidget(self.head_widget, 0, 0, 0, 0) # 创建中部(middle) self.middle_widget = QWidget() self.middle_layout = QGridLayout() self.middle_widget.setLayout(self.middle_layout) for i in range(self.row): self.middle_icon = QLabel(chr(0xf002) + f'目录_{i}:') self.middle_icon.setFont(qtawesome.font('fa', 12)) self.middle_input = QLineEdit() # self.middle_input.setPlaceholderText("请选择文件...") self.middle_input.setObjectName(f'middle_input_{i}') self.middle_btn = QPushButton( qtawesome.icon('fa.film', color='green'), "选择文件") self.middle_btn.setObjectName(f'middle_btn_{i}') self.middle_btn.clicked.connect(self.open_dir) self.middle_layout.addWidget(self.middle_icon, i, 0, 1, 1) self.middle_layout.addWidget(self.middle_input, i, 1, 1, self.row - 1) self.middle_layout.addWidget(self.middle_btn, i, self.row, 1, 1) self.mid_layout.addWidget(self.middle_widget, 0, 0, 1, 1) # 创建尾部 self.tail_widget = QWidget() self.tail_layout = QGridLayout() self.tail_widget.setLayout(self.tail_layout) self.tail_btn = QPushButton( qtawesome.icon('fa.download', color='green'), "运行") self.tail_layout.addWidget(self.tail_btn, 0, 9, 1, 1) self.down_layout.addWidget(self.tail_widget, 0, 0, 0, 0) self.set_style() self.main_layout.setSpacing(0) # self.setWindowFlag(Qt.FramelessWindowHint) # 隐藏边框 # self.setWindowOpacity(0.9) # 设置窗口透明度 # self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明 def open_dir(self): response = QFileDialog.getOpenFileName() if isinstance(response, tuple): file_path = response[0] if not os.path.exists(file_path): return self.middle_widget.sender().previousInFocusChain().setText( file_path) def _value_change(self): value = self.slide.value() start = value - self.num self.statusBar().showMessage(f'Current Value is {value}') for i in range(self.head_layout.count()): self.head_layout.itemAt(i).widget().deleteLater() self.load_model_ico(start, value) def load_model_ico(self, start, end): for i in range(start, end): self.tool_btn = QToolButton() self.tool_btn.setText(f"{self.icon[i]}") # 设置按钮文本 self.tool_btn.setObjectName(f"{self.icon[i]}") # 设置按钮文本 self.tool_btn.setFixedSize(80, 50) self.tool_btn.setIcon( qtawesome.icon(f'fa.{self.icon[i]}', color='white')) # 设置按钮图标 self.tool_btn.setIconSize(QSize(30, 30)) # 设置图标大小 self.tool_btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) self.tool_btn.clicked.connect(self._clicked) self.head_layout.addWidget(self.tool_btn, 0, i) def _clicked(self): text = self.sender().text() self.statusBar().showMessage(f'Current Value is {text}') self.change_style(text) def change_style(self, text): self.head_widget.setStyleSheet(""" QToolButton{border:none;} QToolButton:hover{border-bottom:2px solid #F76677;} #%s{border:2px dotted black;} """ % text) def set_style(self): self.up_widget.setStyleSheet(""" #up_widget{background:gray;} """) self.mid_widget.setStyleSheet(""" #mid_widget{ background:white; border-top-left-radius: 5px; border-bottom-left-radius: 5px; } """) self.down_widget.setStyleSheet(""" #down_widget{background:darkGray;} """) self.head_widget.setStyleSheet(""" QToolButton{ border:none; } QToolButton:hover{border-bottom:2px solid #F76677;} """) self.middle_widget.setStyleSheet(""" QLineEdit{ border:1px solid gray; /*border-radius:10px;*/ padding:5px 2px; } QPushButton{ border:none; border-right:1px gray; border-radius:10px; width:40%; padding:5px 2px; } QPushButton:hover{ color:red;font-weight: bold; } QLabel{ padding:0 0 0 100%; } """) self.tail_widget.setStyleSheet(""" QPushButton{ border:none; border-right:1px gray; border-radius:10px; padding:5px 2px; } QPushButton:hover{ color:red;font-weight: bold; } """) def paintEvent(self, event): # 设置背景颜色 painter = QPainter(self) background_color = QColor() background_color.setNamedColor('darkGray') painter.setBrush(background_color) painter.drawRect(self.rect())
class PreviewWidgetStyle(QGroupBox): def __init__(self, parent=None): super().__init__(parent) self.setTitle(self.tr("Preview")) self.setMaximumHeight(220) self.setObjectName("groupBox") self.verticalLayout = QVBoxLayout(self) self.verticalLayout.setObjectName("verticalLayout") self.tabWidget = QTabWidget(self) self.tabWidget.setObjectName("tabWidgetPreview") self.tab = QWidget() self.tab.setObjectName("tab") self.horizontalLayout = QHBoxLayout(self.tab) self.horizontalLayout.setObjectName("horizontalLayout") self.groupBox = QGroupBox(self.tab) self.groupBox.setTitle(self.tr("Group Box")) self.groupBox.setObjectName("groupBox") self.verticalLayout_2 = QVBoxLayout(self.groupBox) self.verticalLayout_2.setObjectName("verticalLayout_2") self.radioButton = QRadioButton(self.groupBox) self.radioButton.setText(self.tr("Radio Button")) self.radioButton.setChecked(True) self.radioButton.setObjectName("radioButton") self.verticalLayout_2.addWidget(self.radioButton) self.radioButton_2 = QRadioButton(self.groupBox) self.radioButton_2.setText(self.tr("Radio Button")) self.radioButton_2.setObjectName("radioButton_2") self.verticalLayout_2.addWidget(self.radioButton_2) self.line = QFrame(self.groupBox) self.line.setFrameShape(QFrame.HLine) self.line.setFrameShadow(QFrame.Sunken) self.line.setObjectName("line") self.verticalLayout_2.addWidget(self.line) self.checkBox = QCheckBox(self.groupBox) self.checkBox.setText(self.tr("Check Box")) self.checkBox.setChecked(True) self.checkBox.setObjectName("checkBox") self.verticalLayout_2.addWidget(self.checkBox) self.horizontalLayout.addWidget(self.groupBox) self.verticalLayout_3 = QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") self.progressBar = QProgressBar(self.tab) self.progressBar.setProperty("value", 75) self.progressBar.setObjectName("progressBar") self.verticalLayout_3.addWidget(self.progressBar) self.horizontalSlider = QSlider(self.tab) self.horizontalSlider.setProperty("value", 45) self.horizontalSlider.setSliderPosition(45) self.horizontalSlider.setOrientation(Qt.Horizontal) self.horizontalSlider.setObjectName("horizontalSlider") self.verticalLayout_3.addWidget(self.horizontalSlider) self.horizontalLayout_2 = QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.spinBox = QSpinBox(self.tab) self.spinBox.setObjectName("spinBox") self.horizontalLayout_2.addWidget(self.spinBox) self.pushButton = QPushButton(self.tab) self.pushButton.setText(self.tr("Button")) self.pushButton.setObjectName("pushButton") self.horizontalLayout_2.addWidget(self.pushButton) self.verticalLayout_3.addLayout(self.horizontalLayout_2) self.comboBox = QComboBox(self.tab) self.comboBox.setObjectName("comboBox") self.comboBox.addItem(self.tr("Combo Box")) self.verticalLayout_3.addWidget(self.comboBox) self.horizontalLayout.addLayout(self.verticalLayout_3) self.verticalScrollBar = QScrollBar(self.tab) self.verticalScrollBar.setPageStep(50) self.verticalScrollBar.setOrientation(Qt.Vertical) self.verticalScrollBar.setObjectName("verticalScrollBar") self.horizontalLayout.addWidget(self.verticalScrollBar) self.tabWidget.addTab(self.tab, self.tr("Tab 1")) self.tab_2 = QWidget() self.tab_2.setObjectName("tab_2") self.tabWidget.addTab(self.tab_2, self.tr("Tab 2")) self.verticalLayout.addWidget(self.tabWidget) self.pushButton.installEventFilter(self) self.pushButton.setFocusPolicy(Qt.NoFocus) self.radioButton.installEventFilter(self) self.radioButton.setFocusPolicy(Qt.NoFocus) self.radioButton_2.installEventFilter(self) self.radioButton_2.setFocusPolicy(Qt.NoFocus) self.checkBox.installEventFilter(self) self.checkBox.setFocusPolicy(Qt.NoFocus) self.comboBox.installEventFilter(self) self.comboBox.setFocusPolicy(Qt.NoFocus) self.spinBox.installEventFilter(self) self.spinBox.setFocusPolicy(Qt.NoFocus) self.horizontalSlider.installEventFilter(self) self.horizontalSlider.setFocusPolicy(Qt.NoFocus) self.verticalScrollBar.installEventFilter(self) self.verticalScrollBar.setFocusPolicy(Qt.NoFocus) self.tab.installEventFilter(self) self.tab.setFocusPolicy(Qt.NoFocus) self.tab_2.installEventFilter(self) self.tab_2.setFocusPolicy(Qt.NoFocus) self.tabWidget.installEventFilter(self) self.tabWidget.setFocusPolicy(Qt.NoFocus) self.tabWidget.currentChanged.connect(self.noClick) def noClick(self, x): self.tabWidget.setCurrentIndex(0) def eventFilter(self, obj, event): if self.pushButton: if event.type() == QEvent.MouseButtonRelease: return True elif event.type() == QEvent.MouseButtonPress: return True elif event.type() == QEvent.MouseButtonDblClick: return True else: return False else: super().eventFilter(obj, event)
class TextArea(QWidget): """ 自定义文本展示区域(PS:不能键盘输入那种) 功能:能自动拉长文本区域并且带有滑动条 """ def __init__(self, parent): super().__init__(parent) self.setContentsMargins(0, 0, 0, 0) # 滚动条的宽度 # 对于水平方向的滚动条其实是高度 self.scrollBarWidth = 15 # 文本区 self.textContainer = TextView(self) self.textContainer.setContentsMargins(5, 0, 0, 0) # 设置居顶部显示 self.textContainer.setAlignment(Qt.AlignTop) # 设置文本区域根据文本进行自适应 self.textContainer.adjustSize() self.textContainer.setCallback(self.sizeChange) # 垂直滚动条 self.vBar = QScrollBar(Qt.Vertical, self) # self.vBar.sliderMoved.connect(self.dragV) self.vBar.valueChanged.connect(self.changeVertical) # 一开始隐藏 self.vBar.setVisible(False) # 在水平方向上文字的总长度是否超过容器的宽度标志位 # 只要出现一次超过,那么 self.overHorizontal就永远是True # 除非将超过容器宽度的文本都去除 self.overHorizontal = False # 水平方向上滑块上一次的值 self.hPreValue = 0 # 水平滚动条 self.hBar = QScrollBar(Qt.Horizontal, self) # self.hBar.sliderMoved.connect(self.dragH) self.hBar.valueChanged.connect(self.changeHorizontal) # 初始化的时候隐藏自身 self.hBar.setVisible(False) # 在垂直方向上文字的总高度是否超过容器的高度标志位 # 只要出现一次超过,那么 self.overVertical就永远是True # 除非将超过容器高度的文本都去除 self.overVertical = False # 垂直方向上滑块上一次的值 self.vPreValue = 0 def setSize(self, width, height): """ 设置TextArea的宽度和高度 :param width: 宽度 :param height: 高度 :return: no return """ self.resize(width, height) self.setMaximumSize(width, height) self.setMinimumSize(width, height) # 设置垂直方向ScrollBar的宽度和高度 # 垂直方向ScrollBar的高度等于TextArea的高度 self.vBar.resize(self.scrollBarWidth, height - self.scrollBarWidth) # 移动到指定位置 self.vBar.move(width - self.scrollBarWidth, 0) # 设置水平方向的ScrollBar的宽度和高度 # 水平方向ScrollBar的高度为self.scrollBarWidth self.hBar.resize(width, self.scrollBarWidth) self.hBar.move(0, height - self.scrollBarWidth) # 设置文本区域的高度和宽度 self.textContainer.resize(width, height) self.setStyleSheet("background-color: #088A68;") self.textContainer.setStyleSheet("border: 1px solid #FF0000; color: #FFFFFF;") def setMaximumSize(self, maxw: int, maxh: int) -> None: super().setMaximumSize(maxw, maxh) def setClassName(self, textAreaName=None, labelName=None, vBarName=None, hBarName=None): """ 设置ObjectName :param textAreaName: TextArea的ObjectName :param labelName: 文本区域的ObjectName :param vBarName: 垂直ScrollBar的ObjectName :param hBarName: 水平ScrollBar的ObjectName :return: """ self.setObjectName(textAreaName) self.textContainer.setObjectName(labelName) self.hBar.setObjectName(hBarName) self.vBar.setObjectName(vBarName) def append(self, text): self.textContainer.adjustSize() self.textContainer.append(text) margin = self.contentsMargins() # 如果文本长度超过了容器的宽度, 将标准位置为True # 并且显示水平滑动条 if self.textContainer.width() > (self.width() - margin.left() - margin.right()): self.overHorizontal = True self.hBar.setVisible(True) # 如果文本总高度度超过了容器的宽度, 将标准位置为True # 并且显示垂直滑动条 if self.textContainer.height() > (self.height() - margin.top() - margin.bottom()): self.overVertical = True self.vBar.setVisible(True) def dragHortizontal(self, value): """ 滑块水平方向上的拖拽事件 :argument value :return: """ print("H: " + str(value)) def dragVertical(self, value): """ 滑块垂直方向上的拖拽事件 :argument value :return: """ print("V: " + str(value)) def changeHorizontal(self, v): """ 垂直滑块的值发生改变时 :param v: :return: """ if v == 0: # 由于下列的操作会产生浮点型数据,所以在计算坐标的时候总有偏差 # 所以在 v = 0, 也就是滑动条回到最开始的地方, # self.textContainer对应方向上的坐标也归0,那样就不会出问题了 self.textContainer.move(0, self.textContainer.y()) # 将当前值作为下一次的preValue self.hPreValue = v return # print("change H: {}".format(v)) textW = self.textContainer.width() # 最大值(从0开始计算) maximum = self.hBar.maximum() + 1 # 计算每次改变值对应 self.textContainer在水平方向上需要移动的尺寸 stepW = textW / maximum # 当前值与上一次的值得差 change = v - self.hPreValue move = int(self.textContainer.x() - stepW * change) self.textContainer.move(move, self.textContainer.y()) # 将当前值作为下一次的preValue self.hPreValue = v def changeVertical(self, v): """ 水平滑块的值发生改变时 :param v: :return: """ if v == 0: # 由于下列的操作会产生浮点型数据,所以在计算坐标的时候总有偏差 # 所以在 v = 0, 也就是滑动条回到最开始的地方, # self.textContainer对应方向上的坐标也归0,那样就不会出问题了 self.textContainer.move(self.textContainer.x(), 0) self.vPreValue = v return # print("change V: {}".format(v)) textH = self.textContainer.width() # 最大值(从0开始计算) maximum = self.vBar.maximum() - self.vBar.minimum() + self.vBar.pageStep() # 计算每次改变值对应 self.textContainer在水平方向上需要移动的尺寸 stepH = float(textH) / maximum # 当前值与上一次的值得差 change = v - self.vPreValue move = int(self.textContainer.y() - stepH * change) self.textContainer.move(self.textContainer.x(), move) # 将当前值作为下一次的preValue self.vPreValue = v def sizeChange(self, obj: QLabel): print("size change:{},{} ".format(obj.width(), obj.height()))