7 python qt pyqt pyqt4 python-3.x
我使用QT Designer在PyQT中创建了许多GUI界面,但现在我正在尝试从另一个界面打开一个界面,我不知道该怎么做.. Start.py是运行GUI界面的文件Authentification_1和Acceuil_start.py是运行GUI界面Acceuil_2.py的文件,现在我想从Start.py到Acceuil_start.py午餐.你对此有什么想法吗?谢谢.这是我的代码:
Start.py:
import sys
from PyQt4 import QtCore, QtGui
from Authentification_1 import Ui_Fenetre_auth
from Acceuil_2 import Ui_MainWindow #??? Acceuil_2.py is the file which I want to open
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_Fenetre_auth()
self.ui.setupUi(self)
def authentifier(val): #Slot method
self.Acceuil = Acceuil() #???
self.Acceuil.show() #???
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = StartQT4()
myapp.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
Acceuil_start.py
import sys
from PyQt4 import QtCore, QtGui
from Authentification_1 import Ui_Fenetre_auth
from Acceuil_2 import Ui_MainWindow
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = StartQT4()
myapp.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
首先,您应该命名 GUI 类,以便它们具有不同的名称,而不是通用名称,以便您可以区分它们。
为什么你需要这样做?嗯 - 简单地说,因为它是有道理的 - 如果每个类代表不同类型的对话框,那么它就是不同的类型 - 并且应该以不同的方式命名。有些名称是/可能是:QMessageBox、AboutBox、AddUserDialog等。
在 Acceuil_start.py 中(您也应该重命名其他模块中的类)。
import sys
from PyQt4 import QtCore, QtGui
from Authentification_1 import Ui_Fenetre_auth
from Acceuil_2 import Ui_MainWindow
class Acceuil(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = Acceuil()
myapp.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
在父类中,当您想要创建窗口时,您已经关闭(但它应该在任何情况下都可以工作):
def authentifier(val): #Slot method
self.Acceuil = Acceuil(self) # You should always pass the parent to the child control
self.Acceuil.show() #???
Run Code Online (Sandbox Code Playgroud)
关于父级问题:如果您的小部件/窗口正在创建另一个小部件,将创建者对象设置为父级始终是一个好主意(除了某些特殊情况),您应该阅读本文以了解为什么会这样:
QObject 在对象树中组织自己。当您创建一个以另一个对象作为父对象的 QObject 时,它会被添加到父对象的 Children() 列表中,并在父对象出现时被删除。事实证明,这种方法非常适合 GUI 对象的需求。例如,QShortcut(键盘快捷键)是相关窗口的子窗口,因此当用户关闭该窗口时,快捷方式也会被删除。
编辑 - 最小工作样本
为了了解我想告诉您的内容,我构建了一个简单的示例。你有两个类 -MainWindow和
ChildWindow。通过创建单独的QApplication对象,每个类都可以在没有其他类的情况下工作。但是,如果您导入ChildWindowin MainWindow,您将创建ChildWindow连接到单次计时器的插槽,该计时器将在 5 秒内触发。
主窗口.py:
import sys
from PyQt4 import QtCore, QtGui
from ChildWindow import ChildWindow
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
QtCore.QTimer.singleShot(5000, self.showChildWindow)
def showChildWindow(self):
self.child_win = ChildWindow(self)
self.child_win.show()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
子窗口.py:
import sys
from PyQt4 import QtCore, QtGui
class ChildWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle("Child Window!")
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = ChildWindow()
myapp.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)