PyQt4 - clicked.connect是否记得以前的连接?

时间:2014-08-27 23:40:21

标签: python user-interface pyqt pyqt4 pyqt5

所以基本上我有一个带有多个按钮的主菜单,当点击一个按钮时,它应该将布局更改为新窗口。这样可以正常工作,但是当我使用新窗口上的返回按钮单击时,当我单击主菜单上的另一个按钮时,它会将我带回到第一个单击的按钮。

我是一个完整的菜鸟,代码是如此粗糙,只是一种练习,但我无法弄明白!!!

(尽量不要嘲笑它只是一个测试应用程序的代码/变量

我编写了2个按键来工作:

 def Layout(self):

    verticle = QVBoxLayout()
    Horizontal = QHBoxLayout()
    Horizontal_pic = QHBoxLayout()


    self.btn_feed = QPushButton("Feed")
    self.btn_status = QPushButton("Status")
    self.btn_play = QPushButton("Play")
    self.btn_fight = QPushButton("Fight")


    Horizontal.addWidget(self.btn_feed)
    Horizontal.addWidget(self.btn_status)
    Horizontal.addWidget(self.btn_play)
    Horizontal.addWidget(self.btn_fight)


    self.pic = QLabel()
    self.pixmap = QPixmap("{0:^10}".format("charmander.png"))
    pixmap = self.pixmap.scaledToHeight(344)
    self.pic.setPixmap(pixmap)
    self.btn = QLabel(" ")

    Horizontal_pic.addWidget(self.btn)
    Horizontal_pic.addWidget(self.pic)
    Horizontal_pic.addWidget(self.btn)

    verticle.addLayout(Horizontal_pic)
    verticle.addLayout(Horizontal)

    self.mainwindow = QWidget()

    self.mainwindow.setLayout(verticle)

    self.setGeometry(700, 300, 500, 500)

    self.btn_status.clicked.connect(self.statusbutton) #button 1 
    self.btn_feed.clicked.connect(self.feedbutton) # button 2

    def statusbutton(self):
    self.Status()
    self.stacked.addWidget(self.statuslayout)
    self.stacked.setCurrentIndex(1)

以下是调用布局的方法

def statusbutton(self):
    self.Status()
    self.stacked.addWidget(self.statuslayout)
    self.stacked.setCurrentIndex(1)

def feedbutton(self):
    self.Feed()
    self.stacked.addWidget(self.feedlayout)
    self.stacked.setCurrentIndex(1)

def mainlayout(self):
    self.Layout()
    self.stacked.addWidget(self.mainwindow)
    self.stacked.setCurrentIndex(0)

这是它改为

的布局/窗口
    def Status(self):
    font = QFont("Comic Sans MS",15)

    Overall = QHBoxLayout()

    horz1 = QHBoxLayout()
    horz2 = QHBoxLayout()
    horz3 = QHBoxLayout()

    self.pic = QLabel()
    pixmap = self.pixmap.scaledToWidth(250)
    self.pic.setPixmap(pixmap)

    verticlepic = QVBoxLayout()
    verticlepic.addWidget(self.pic)

    lbl_hunger = QLabel("Hunger ")
    lbl_hunger.setFont(font)
    lbl_age = QLabel("Age      ")
    lbl_age.setFont(font)
    lbl_attack = QLabel("Attack  ")
    lbl_attack.setFont(font)




    horz1.addWidget(lbl_hunger)
    horz1.addWidget(QLineEdit(str(self.hunger)))
    horz2.addWidget(lbl_age)
    horz2.addWidget(QLineEdit(str(self.age)))
    horz3.addWidget(lbl_attack)
    horz3.addWidget(QLineEdit(str(self.attack)))

    vertall = QVBoxLayout()
    vertall.addLayout(horz1)
    vertall.addLayout(horz2)
    vertall.addLayout(horz3)

    Overall.addLayout(verticlepic)
    Overall.addLayout(vertall)

    under_button = QVBoxLayout()
    rtrn_button = QPushButton("Return")
    under_button.addWidget(rtrn_button)

    under_button.addLayout(Overall)

    self.statuslayout = QWidget()
    self.statuslayout.setLayout(under_button)

    self.setGeometry(700, 300, 500, 75)

    rtrn_button.clicked.connect(self.mainlayout)



def Feed(self):
    horizontal = QHBoxLayout()

    self.pic = QLabel()
    pixmap = self.pixmap.scaledToWidth(250)
    self.pic.setPixmap(pixmap)

    feed_btn = QPushButton("Feed")
    go_back = QPushButton("Go Back")

    horizontal.addWidget(feed_btn)
    horizontal.addWidget(self.pic)
    horizontal.addWidget(go_back)

    self.feedlayout = QWidget()
    self.feedlayout.setLayout(horizontal)


    self.setGeometry(700, 300, 500, 50)

    go_back.clicked.connect(self.mainlayout)

1 个答案:

答案 0 :(得分:0)

首先,只做一次:

self.stacked.addWidget(self.mainwindow)
self.stacked.addWidget(self.statuslayout)
self.stacked.addWidget(self.feedlayout)

然后使用这些索引调用布局方法:

self.stacked.setCurrentIndex(0) # for mainwindow
self.stacked.setCurrentIndex(1) # for statuslayout
self.stacked.setCurrentIndex(2) # for feedlayout

问题是什么:

  1. 您将mainwindow添加到位置0的stacked,然后设置:self.stacked.setCurrentIndex(0),这很好

  2. 您打开,例如statuslayout已添加到位置1到stacked,然后将其设置为self.stacked.setCurrentIndex(1),这也很好

  3. 关闭statuslayoutmainwindow再次添加到stacked,这次是在位置2,但是您设置的小部件的索引为0,这也是mainwindow ,所以这将起作用

  4. 在此步骤中,您按哪个按钮并不重要,例如它可能是feedlayout:它已在第3位添加到stacked,但是您设置self.stacked.setCurrentIndex(1),因此statuslayout设置为statuslayout,因为stecked位于{{1}}的第1位。