【问题标题】:Load QDialog directly from UI-File?直接从 UI 文件加载 QDialog?
【发布时间】:2017-04-14 16:34:19
【问题描述】:

我使用 QT Designer 并用它创建我的 GUI。要启动主程序,我使用以下代码:

import sys
from PyQt4 import uic, QtGui, QtCore
from PyQt4.QtGui import *
from PyQt4.QtCore import *

try:
    _fromUtf8 = QtCore.QString.fromUtf8

except AttributeError:
    def _fromUtf8(s):
    return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)

except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

def main():
    app = QtGui.QApplication(sys.argv)
    myWindow = MyWindowClass()
    myWindow.show()
    app.exec_()

main_dialog = uic.loadUiType("GUI.ui")[0]

class MyWindowClass(QtGui.QMainWindow, main_dialog):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.setupUi(self)

if __name__ == "__main__": 
    main()

所以我用这行 main_dialog = uic.loadUiType("GUI.ui")[0] 定义了我创建的 UI 文件。

现在,当我使用 QDialogs 时,我只是通过首先创建它们,然后将它们转换为 Python 代码(使用 PYUIC4),然后在我的主 python 文件中实现代码并以这种方式运行 QDialog 来完成运行它们:

def NameOfDialog(self):
    dialog = Qdialog()            
    dialog.ui = NameOfDialogClass()
    dialog.ui.setupUi(dialog)
    dialog.exec_()

明显的问题是,每当我对 GUI 进行任何微小的更改时,我都必须再次完成整个过程(将代码转换并放入主代码中,并注意不要删除我添加和需要的任何其他行保持)。

我确信有一个解决方案也可以直接引用 QDialog 的 UI 文件,但是如何?我尝试了与主窗口相同的方法,但没有成功:(

谢谢!

编辑:

这是我在一个最小示例中尝试过的,但它不起作用。我错过了什么?

#-*- encoding: UTF-8 -*-
import sys
from PyQt4 import uic, QtGui, QtCore
from PyQt4.QtGui import *
from PyQt4.QtCore import *

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig,     _encoding)

except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

def main():
    app = QtGui.QApplication(sys.argv)
    myWindow = MyWindowClass()
    myWindow.show()
    app.exec_()

main_dialog = uic.loadUiType("GUI.ui")[0]

TestQDialog = uic.loadUiType("Dialog.ui")[0]

class QDialogClass(object, TestQDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)

class MyWindowClass(QtGui.QMainWindow, main_dialog):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.btn_close.clicked.connect(self.dialog)

    def dialog(self):
        dialog = Qdialog()
        dialog.ui = QDialogClass()
        dialog.ui.setupUi(dialog)
        dialog.exec_()

if __name__ == "__main__":
    main()

【问题讨论】:

  • 请发布您尝试过的对话代码,但没有成功。您答案中的所有其他代码都无关紧要。
  • @ekhumoro 我添加了我尝试过的代码示例,但肯定不起作用:(

标签: python python-2.7 pyqt4 qdialog


【解决方案1】:

您的对话框类应该以与主窗口类完全相同的方式定义。我自己显然无法测试,但脚本应该是这样的:

import sys
from PyQt4 import uic, QtGui, QtCore

main_dialog = uic.loadUiType("GUI.ui")[0]    
TestQDialog = uic.loadUiType("Dialog.ui")[0]

class QDialogClass(QtGui.QDialog, TestQDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)

class MyWindowClass(QtGui.QMainWindow, main_dialog):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.btn_close.clicked.connect(self.dialog)

    def dialog(self):
        dialog = QDialogClass()
        dialog.exec_()

def main():
    app = QtGui.QApplication(sys.argv)
    myWindow = MyWindowClass()
    myWindow.show()
    app.exec_()

if __name__ == "__main__":  
    main()

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 2019-09-11
    • 2020-11-04
    • 1970-01-01
    • 2021-08-24
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多