gpt4 book ai didi

python - 如何从主窗口打开子窗口

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:38 26 4
gpt4 key购买 nike

我的问题很难解释,但我正在尽力请在这方面帮助我。
我在QtDesigner中设计了一个g ui,并将.ui文件转换为.py,例如main_window.py现在为了避免在main_window.py中更改,我为侦听器创建了另一个类。

class Main():    
window = None
app = None

def __init__(self):
self.launch()
self.attach_listener()
self.execute()

''' Launch GUI '''
def launch(self):
self.app = QtGui.QApplication(sys.argv)
self.window = Ui_MainWindow()
self.window.show()

''' Execute Window '''
def execute(self):
sys.exit(self.app.exec_())

''' Attach Listeners '''
def attach_listener(self):
self.window.add_button.clicked.connect(self.add_listener)
self.window.delete_button.clicked.connect(self.delete_listener)
self.window.update_button.clicked.connect(self.update_listener)
self.window.connect(self.window.combo_box, QtCore.SIGNAL('activated(QString)'), self.logout_listener)

我有另一个具有相同结构的child_window.py,但由于qapplication的原因,我无法从这个窗口打开该窗口。我在寻找答案,但无法申请我的代码。当类从QtGui.QMainWindow或QtGui.QWidget扩展时,这些答案是适用的,但我的场景不同。

最佳答案

您将UIAN主窗口对象与实际窗口对象(QMeNeWindow、Q对话、QWIDGET等)混合,Self.Window=UIAN MWindWindow()不做任何事情,因为您将它附加到的类不是窗口。您需要创建一个窗口并对其应用Ui主窗口。
显然你可以,但看起来不好看。您需要通过findChild访问小部件我能看到的唯一好处是,在设计器中更改表单后,您不会运行pyside uic,这非常简单。
更简单的方法
使用py uic/pyside uic时,它会将.ui文件转换为.py文件。
您不应该编辑.py,因为下次使用qtdesigner时它们将被覆盖。您需要创建一个窗口类并对其应用ui类。
设置新窗体
在qtdesigner-类名主窗口中生成文件mainwinui.ui
使用pyside uic-o mainwinui.py mainwinui.ui转换。mainwinui.py从不手动编辑
创建mainwinclass.py以加载ui.py并执行所有自定义ui工作
在主WinClass.py中声明信号和插槽、使用.connect等
其中一些模块名可能看起来有点尴尬,但我已经解决了,因为在过去,我遇到了模块和类之间名称冲突的问题;这是因为我不理解qt设计器将如何处理它的命名。
如果查看pyside uic创建的文件,它的顶部包含需要在mainwinclass.py中使用的正确类和方法名。
主界面.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mainWinui.ui'
#
# Created: Sun Feb 7 14:22:09 2016
# by: pyside-uic 0.2.15 running on PySide 1.2.4
#
# WARNING! All changes made in this file will be lost!

from PySide import QtCore, QtGui

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")

创建一个新的mainwinclass.py并将正确的导入和类名复制到其中,再加上一些样板文件来加载.ui。
看起来是这样的:
主卷扬机.py
from mainWinui import Ui_MainWindow
from PySide import QtGui


class MainWin(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.setup_signals()

# Is this is the same as your Listeners ??
def setup_signals(self):
# Signal for updating the lineedits from the grid
self.ui.tabWidget.currentChanged.connect(self.onTabChanged)
# Connect the "Add Staff" button to the addStaffMember method
self.ui.btnAddStaff.clicked.connect(self.addStaffMember)

然后使用另一个文件来启动应用程序本身,并维护应用程序的一些非gui方面,如更新程序或全局日志记录。
我在这里看到了所有子窗口都被实例化到的代码,但我(通常)不会这样做我把它们保留在主要的形式。这取决于你打算如何设计应用程序。
应用程序名.py
from PySide import QtGui, QtCore
from mainwinClass import MainWin
import sys


if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
mainWin = MainWin()

mainWin.show()
sys.exit(app.exec_())

# Nothing else _needed_ in here

现在对于任何子窗口,请再次执行相同的操作。
模态形式
在Qt设计器中创建一个新的“底部有按钮的对话框”。
根据需要添加小部件并另存为dialogaddstaffui.ui。
跑步
pyside-uic -o dialogAddStaffui.py dialogAddStaffui.ui.

创建一个名为dialogaddstaffclass.py的新的空文本文档,并使用
dialogAddStaffui.ui作为类名等的引用。编辑dialogAddStaffClass.py如下:
DialogAddStaffClass类
from dialogAddStaffui import Ui_DialogAddStaff
from PySide import QtCore, QtGui


class DialogAddStaff(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.ui = Ui_DialogAddStaff()
self.ui.setupUi(self)
# Your own init stuff

这两种进口是这里唯一需要的。
如果你想复制这个,请意识到在qt设计器中
windowmodality=applicationmodal,表单是一个“底部有按钮的对话框”
对于这些简单的表单,它们有一个accept方法,该方法检查用户输入并使用self.done关闭的数据的有效性(1)。
如果要查看如何处理验证和关闭:
DialogAddStaffClass类
def validate(self):
retval = True
if not self.ui.editLname.text():
retval = False
QtGui.QMessageBox.information(self, 'Invalid Last name',
"Last Name must not be blank")
self.ui.editLname.setFocus()
return retval

def accept(self):
if self.validate():
self.done(1)

使用这些对话框表单,Qt自动将OK按钮设置为fire accept我只是对那种方法不屑一顾。
如果希望在父对象和子对象之间进行通信,可以在子对象上设置引用父对象的属性,或者在子对象关闭后,但在其变量被垃圾收集之前读取其属性。创建循环引用时可能会出现问题,因此请小心。
由于新窗体是模态的,用户在关闭子窗体之前无法与主窗体交互,并且启动chil d窗口的函数将停止,直到子窗口关闭,因此可以使用局部变量保存子类。
“add staff”按钮连接到addstaffmember函数。
主卷扬机.py
from dialogAddStaffClass import DialogAddStaff


def addStaffMember(self):
addStaffForm = DialogAddStaff()
res = addStaffForm.exec_() # exec_ waits, show would continue
# Function waits here for the Modal form to close.
if res: # child was closed with OK and validated correctly
print(addStaffForm.ui.editLname.text())
# Saveing other Staff data happens here

因为子窗体是用exec运行的,所以主窗体在继续之前会一直等到子窗体关闭为止当函数退出AdHuffStand变量是垃圾收集时,因此不再有任何对子窗体属性的引用。(可能没有表格……)
如果你想打开一个长寿的表单,你可以在一个更持久的地方实例化它。
非模态形式
下面是一个SistPerform的例子它是在设计器中从“主窗口”类型创建的(它有自己的菜单和状态栏等)。如果不需要这些装饰,请使用对话框窗体,但将其“窗口模式”设置为“非模式”。
在Qt设计器中创建SisterWin ui.ui-设置objectName SisterWin
pyside uic-o sisterwinui.py sisterwinui.ui
创建一个文件sisterwinlass.py-设置它的import和init
创建一个变量将其保存在一个长寿的地方(mainwin本身,使用self)。ref属性)
为它制作一个启动按钮并将其连接到mainwin类中的方法
sisterWinui.ui公司
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'sisterWinui.ui'
#
# Created: Mon Feb 8 12:05:37 2016
# by: pyside-uic 0.2.15 running on PySide 1.2.4
#
# WARNING! All changes made in this file will be lost!

from PySide import QtCore, QtGui

class Ui_SisterWin(object):
def setupUi(self, SisterWin):
SisterWin.setObjectName("SisterWin")

运行uic
pyside-uic -o sisterWinui.py sisterWinui.ui

创建一个文件sisterwinlass.py-设置它的import和init
SisterwinClass.py公司
from sisterWinui import Ui_SisterWin
from PySide import QtCore, QtGui


class SisterWin(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_SisterWin()
self.ui.setupUi(self)
# Your custom stuff after this

在qt设计器中,在主窗体中添加一个按钮或其他内容以启动sisterform。然后对主卷扬机进行一些编辑。
做一个变量把它保存在一个长寿的地方
主卷扬机
from sisterwinClass import SisterWin
# no other new imports needed, just the stuff you had before


class MainWin(QtGui.QMainWindow):
def __init__(self, parent=None):
# These three lines were already there
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# Add a long lived attribute to hold the class instance
self.sisterWin = None
# Next line was already there
self.setup_signals()

def setup_signals(self):
# Connect button to openSisterWin
self.ui.btnSisterwin.clicked.connect(self.openSisterWin)
# You probably have other connects after this


# This toggles the window
def openSisterWin(self):
if not self.sisterWin:
self.sisterWin = SisterWin()
if self.sisterWin.isVisible():
print('Hiding')
self.sisterWin.hide()
# hide or close, it's your choice
# self.sisterWin.close()
else:
print('Showing')
self.sisterWin.show()

我希望这能涵盖你现在要找的东西?
如果要找出如何隐藏主窗口,请查看 make this work
快乐黑客:-)

关于python - 如何从主窗口打开子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35255377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com