Python plasmoid中的多个布局/布局过渡

1 投票
1 回答
703 浏览
提问于 2025-04-16 07:01

我正在做一个小的Python小程序,它可以处理远程资源。这里是代码:glpoid

这个程序提供了一个查看票据的界面(默认界面),还有一个可以让用户填写并发送新票据的界面,最后还有一个查看票据详情的界面……

我遇到的问题是,当我切换到另一个界面时,不知道怎么“关闭”当前的布局(或者让它消失)。

对于每个布局,我会定义一些项目,然后把这些项目添加到布局定义中,最后显示新的布局:

最开始,我用self.view_tickets_ui()显示默认界面。每个布局都是在name_ui()方法中定义的,这些方法会重新定义布局并传递给小程序。

简单来说,它是这样定义的:

class GLPIApplet(plasmascript.Applet):
    def __init__(self,parent,args=None):
        plasmascript.Applet.__init__(self,parent)

    def init(self):
        self.setHasConfigurationInterface(False)
        self.setAspectRatioMode(Plasma.Square)
        self.resize(400,650)
        # new ticket button
        self.new = Plasma.PushButton()
        self.new.setText('Nouveau Ticket')
        self.connect(self.new, SIGNAL('clicked()'), self.new_ticket_ui)
        # refresh button
        self.refresh = Plasma.PushButton()
        self.refresh.setText('Rafraichir')
        self.connect(self.refresh, SIGNAL('clicked()'), self.view_tickets_ui)       
        # initialize
        self.view_tickets_ui()

    def view_tickets_ui(self, message=None):
        # layout of ticket view
        self.layout = QGraphicsLinearLayout(Qt.Vertical)
        self.layout.itemSpacing(3)           
        self.layout.addItem(self.new)
        self.view_tickets()
        self.layout.addItem(self.refresh)
        self.applet.setLayout(self.layout)

    def new_ticket_ui(self, message=None):
        # layout of a new ticket
        self.layout = QGraphicsLinearLayout(Qt.Vertical)
        self.layout.itemSpacing(3)
        message_label = Plasma.Label()
        message_label.setText('the message:')            
        self.layout.addItem(message_label)
        self.applet.setLayout(self.layout)

这里的init只是定义了一些按钮,然后调用view_tickets_ui()来放置一些项目并显示布局。如果我之后调用new_ticket_ui(),它会把元素添加到当前布局……所以两个界面会在同一个地方显示。

请问我该怎么处理这个问题呢??

1 个回答

1

你可以使用一个叫做 Plasma.TabBar 的东西,里面可以有隐藏的标签页,然后在这些标签页之间切换,就像在IRC上提到的那样。你只需要把 clicked 信号连接到可以切换标签页的功能上,这样一切就能正常运作了。

另外,关于风格的建议:尽量使用新的信号/槽API,这样会更好:

self.connect(self.refresh, SIGNAL('clicked()'), self.view_tickets_ui)

应该变成

self.refresh.clicked.connect(self.view_tickets_ui).

撰写回答