コード例 #1
0
ファイル: my_scroll_bar.py プロジェクト: imfog/Groove
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())
コード例 #2
0
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)
コード例 #3
0
ファイル: test.py プロジェクト: Violet-maple/LearnGUI-PyQt
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())
コード例 #4
0
ファイル: tabwidget.py プロジェクト: friberk/kaptan
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)
コード例 #5
0
ファイル: TextArea.py プロジェクト: kamiyong/pyqt5
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()))
コード例 #6
0
ファイル: tabwidget.py プロジェクト: WhiteSymmetry/kaptan
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)