PyQt4 - clicked.connect 记住以前的连接?

Posted

技术标签:

【中文标题】PyQt4 - clicked.connect 记住以前的连接?【英文标题】:PyQt4 - clicked.connect is remembering previous connection? 【发布时间】:2014-08-27 23:40:21 【问题描述】:

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

我完全是个菜鸟,代码太粗糙了,只是练习,但我想不通!!!

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

我已经编写了 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】:

首先,只做一次:

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

出了什么问题:

    你将mainwindow添加到stacked的位置0,并设置为:self.stacked.setCurrentIndex(0),这样就可以了

    你打开,比如statuslayout加到位置1到stacked,然后用self.stacked.setCurrentIndex(1)设置,也可以

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

    在这一步,你按下哪个按钮并不重要,例如它可能是feedlayout:它在位置3添加到stacked,但你设置self.stacked.setCurrentIndex(1),所以statuslayout将因为statuslayout 位于stecked 中的位置1。

【讨论】:

以上是关于PyQt4 - clicked.connect 记住以前的连接?的主要内容,如果未能解决你的问题,请参考以下文章

clicked.connect() 不会访问该方法

我不能 clicked.connect() QFormLayout 上的 QPushButton [重复]

PySide Qt self.function 在 clicked.connect() 中不起作用

Qt 正确的 connect() 调用

PyQt 中这两个 clicked() 信号有啥区别?

如何阻止信号到达自定义插槽