我试图使用PyQt4从python 2.7中的按钮单击调用另一个窗口。下面的代码打开AddBooking对话框,但立即关闭它。我是Gui编程的新手,有人可以告诉我我的代码有什么问题吗?
from PyQt4 import QtGui
from HomeScreen import Ui_HomeScreen
from AddBooking import Ui_AddBooking
import sys
class HomeScreen(QtGui.QWidget, Ui_HomeScreen):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUi(self)
self.show()
self.Add_Booking_Button.clicked.connect(self.handleButton)
def handleButton(self):
AddBooking2()
class AddBooking2(QtGui.QWidget, Ui_AddBooking):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUi(self)
self.show()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = HomeScreen()
window.show()
sys.exit(app.exec_())
答案 0 :(得分:0)
不要使用多继承,也不要在类初始值设定项中调用show
函数。问题是您使用AddBooking2()
创建的对象是暂时的,并且在函数结束时会自动销毁。因此,您需要使用一些变量来引用该对象:
addbooking = AddBooking2()
addbooking.show()
此外,由于您使用的是QtDesigner
和pyuic4
工具,因此您可以更轻松地建立连接。说,你的代码可以修改:
from PyQt4 import QtGui
from PyQt4.QtCore import pyqtSlot
from HomeScreen import Ui_HomeScreen
from AddBooking import Ui_AddBooking
import sys
class HomeScreen(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_HomeScreen()
self.ui.setupUi(self)
@pyqtSlot("")
def on_Add_Booking_Button_clicked(self): # The connection is carried by the Ui_* classes generated by pyuic4
addbooking = AddBooking2()
addbooking.show()
class AddBooking2(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_AddBooking()
self.ui.setupUi(self)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = HomeScreen()
window.show()
sys.exit(app.exec_())
答案 1 :(得分:0)
对话框立即关闭,因为你没有保留对它的引用,所以一旦它超出范围就会被垃圾收集。
解决问题的最简单方法是执行以下操作:
def handleButton(self):
self.dialog = AddBooking2()
self.dialog.show()
您还可以从self.show()
和AddBooking2.__init__
中删除HomeScreen.__init__
行,这些行是多余的。除此之外,您的代码看起来很好。