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)
设置,也可以
你关闭 statuslayout
,mainwindow
再次添加到 stacked
,这次是在位置 2,但你设置了索引为 0 的小部件,这也是 mainwindow
,所以这将起作用
在这一步,你按下哪个按钮并不重要,例如它可能是feedlayout
:它在位置3添加到stacked
,但你设置self.stacked.setCurrentIndex(1)
,所以statuslayout
将因为statuslayout
位于stecked
中的位置1。
【讨论】:
以上是关于PyQt4 - clicked.connect 记住以前的连接?的主要内容,如果未能解决你的问题,请参考以下文章
我不能 clicked.connect() QFormLayout 上的 QPushButton [重复]