如何在pyqt5中使用拆分器切换布局?

2024-05-04 12:36:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我要切换正确的框架布局与拆分器,我能怎么做?我正在尝试使用QStackedWidget,但它失败了。以下是我的代码:

绘制布局

def draw_layout(self):
        try:
            main_layout = QVBoxLayout(self)

            #create frame of main tab 
            tab_layout = QHBoxLayout(self)

            left_frame = QFrame(self)
            right_frame = QFrame(self) 
            right_frame2 = QFrame(self) 

            Stack = QStackedWidget(self)
            Stack.addWidget(right_frame)
            Stack.addWidget(right_frame2)

            left_frame.setFrameShape(QFrame.StyledPanel)
            right_frame.setFrameShape(QFrame.StyledPanel)
            right_frame2.setFrameShape(QFrame.StyledPanel)

            self.right_frame = right_frame2

            # split left and right
            splitter = QSplitter(SPLIT_H)
            splitter.addWidget(left_frame)
            splitter.addWidget(self.Stack)
            splitter.setStretchFactor(1, 10)

            # add to widget
            tab_layout.addWidget(splitter)
            main_layout.addLayout(tab_layout, 1)

            #draw left frame
            self.draw_left_frame(left_frame)
            self.draw_right_frame(right_frame)
            self.draw_right_frame2(right_frame2)

            self.setLayout(main_layout)

        except Exception as e:
            traceback.print_exc()
            err = sys.exc_info()[1]
            LOG_write_log(LOG_ERROR, str(err))

左框

^{pr2}$

Tags: selfrightstackmainleftframetablayout
1条回答
网友
1楼 · 发布于 2024-05-04 12:36:29

在QStackedWidget.setCurrentIndex(索引) 此属性保存可见小部件的索引位置。在

试试看:

from PyQt5.QtWidgets import *
from PyQt5.QtCore    import *

class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)

        self.currentWidgetRightFrame = 0
        self.draw_layout()

    def draw_layout(self):
        main_layout = QVBoxLayout(self) 
        #create frame of main tab 
        tab_layout = QHBoxLayout()

        left_frame   = QFrame(self)
        lbLeft = QLabel(" left_frame   ", left_frame) 
        right_frame  = QFrame(self)
        lbRight1 = QLabel(" 1 right_frame", right_frame)  
        right_frame2 = QFrame(self) 
        lbRight2 = QLabel(" 2 right_frame", right_frame2) 

        self.Stack = QStackedWidget(self)
        self.Stack.addWidget(right_frame)
        self.Stack.addWidget(right_frame2)

        left_frame.setFrameShape(QFrame.StyledPanel)
        right_frame.setFrameShape(QFrame.StyledPanel)
        right_frame2.setFrameShape(QFrame.StyledPanel)

        self.right_frame = right_frame2

        # split left and right
        #splitter = QSplitter(SPLIT_H)  
        splitter = QSplitter(self)
        splitter.addWidget(left_frame)
        splitter.addWidget(self.Stack)       
        splitter.setStretchFactor(1, 10)

        # add to widget
        tab_layout.addWidget(splitter)
        main_layout.addLayout(tab_layout, 1)

        #draw left frame
        self.draw_left_frame(left_frame)
        self.setLayout(main_layout)

    def draw_left_frame(self, frame):
        main_layout = QVBoxLayout(frame)

        confirm_btn = QPushButton("switch right_frame", self)      
        confirm_btn.setFixedWidth(100)
        main_layout.addWidget(confirm_btn, 0)    
        #confirm_btn.clicked.connect(lambda:self.confirm(frame))
        confirm_btn.clicked.connect(self.confirm)

        #main_layout.setAlignment(ALIGN_TOP)


    @pyqtSlot()
    #def TAB_VIEW_quote_search_code(self, req_quote):
    def confirm(self): #, req_quote):
        if self.currentWidgetRightFrame == 0:
            self.Stack.setCurrentIndex(1)
            self.currentWidgetRightFrame = 1
        else:
            self.Stack.setCurrentIndex(0)
            self.currentWidgetRightFrame = 0        


if __name__ == "__main__":
    import sys  
    app = QApplication(sys.argv)
    app.setStyle("fusion")
    w = Widget()
    w.show()
    sys.exit(app.exec_())            

enter image description here

相关问题 更多 >