【问题标题】:Qt QDialog rendering stackedQt QDialog 渲染堆叠
【发布时间】:2014-01-24 19:20:46
【问题描述】:

这是我在 Qt 中的第一步。我正在尝试像本教程一样构建简单的文本编辑器:http://www.rkblog.rk.edu.pl/w/p/simple-text-editor-pyqt4/

所以,我在 Qt Designer 中创建了设计。这是预览:

完美:)

这里是 Qt 对象和类,以明确布局是如何构建的:

我已经编译了 .py 文件:

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

# Form implementation generated from reading ui file 'G:\Google Drive\py_scripts\QTUI\simpleTextEditor_gui.ui'
#
# Created: Fri Jan 24 20:06:32 2014
#      by: PyQt4 UI code generator 4.10.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

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)

class Ui_simpleTextEditor(object):
    def setupUi(self, simpleTextEditor):
        simpleTextEditor.setObjectName(_fromUtf8("simpleTextEditor"))
        simpleTextEditor.resize(524, 413)
        self.gridLayout = QtGui.QGridLayout(simpleTextEditor)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.editorWindow = QtGui.QTextEdit(simpleTextEditor)
        self.editorWindow.setObjectName(_fromUtf8("editorWindow"))
        self.verticalLayout.addWidget(self.editorWindow)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.buttonOpen = QtGui.QPushButton(simpleTextEditor)
        self.buttonOpen.setObjectName(_fromUtf8("buttonOpen"))
        self.horizontalLayout.addWidget(self.buttonOpen)
        self.buttonClose = QtGui.QPushButton(simpleTextEditor)
        self.buttonClose.setObjectName(_fromUtf8("buttonClose"))
        self.horizontalLayout.addWidget(self.buttonClose)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)

        self.retranslateUi(simpleTextEditor)
        QtCore.QObject.connect(self.buttonClose, QtCore.SIGNAL(_fromUtf8("clicked()")), simpleTextEditor.close)
        QtCore.QMetaObject.connectSlotsByName(simpleTextEditor)

    def retranslateUi(self, simpleTextEditor):
        simpleTextEditor.setWindowTitle(_translate("simpleTextEditor", "Simple Text Editor", None))
        self.buttonOpen.setText(_translate("simpleTextEditor", "Open", None))
        self.buttonClose.setText(_translate("simpleTextEditor", "Close", None))

并创建了我非常简单的应用程序:

import sys
from PyQt4 import QtCore, QtGui
from simpleTextEditor_gui import Ui_simpleTextEditor

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_simpleTextEditor()
        self.ui.setupUi(self)
        # tutaj dajemy wlasne polaczenia slotow
        QtCore.QObject.connect(self.ui.buttonOpen,QtCore.SIGNAL("clicked()"), self.file_dialog)
    def file_dialog(self):
        fd = QtGui.QFileDialog(self)
        self.filename = fd.getOpenFileName()
        from os.path import isfile
        if isfile(self.filename):
            text = open(self.filename).read()
            self.ui.editorWindow.setText(text)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())

现在,当我运行应用程序时,所有对象都堆叠起来,如下所示:

任何帮助表示赞赏!

【问题讨论】:

    标签: python qt pyqt qdialog


    【解决方案1】:

    您的代码的主要问题是您为 StartQT4 子类使用了错误的基类。它应该匹配来自 Qt Designer 的顶级类,即 QDialog

    您还可以通过将 ui 直接添加到您的子类并使用 new-style signal and slot syntax 来稍微简化您的代码。

    进行这些更改后,您的代码将如下所示:

    import sys
    from PyQt4 import QtCore, QtGui
    from simpleTextEditor_gui import Ui_simpleTextEditor
    
    class StartQT4(QtGui.QDialog, Ui_simpleTextEditor):
        def __init__(self, parent=None):
            QtGui.QDialog.__init__(self, parent)
            self.setupUi(self)
            # tutaj dajemy wlasne polaczenia slotow
            self.buttonOpen.clicked.connect(self.file_dialog)
    
        def file_dialog(self):
            fd = QtGui.QFileDialog(self)
            self.filename = fd.getOpenFileName()
            from os.path import isfile
            if isfile(self.filename):
                text = open(self.filename).read()
                self.editorWindow.setText(text)
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        myapp = StartQT4()
        myapp.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 太棒了!完美运行 - 现在我需要做的就是理解它 :) 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2019-11-10
    • 2019-04-02
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多