Qt QDialog渲染重叠问题

3
这是我在Qt中的第一步。我正在尝试构建一个简单的文本编辑器,就像这个教程中所示:http://www.rkblog.rk.edu.pl/w/p/simple-text-editor-pyqt4/ 因此,我已经在Qt Designer中创建了设计。这是预览图: QtDesignerPreview 非常完美 :)
下面是Qt对象和类,以清楚地说明布局是如何构建的: QtObjCls 我已经编译了.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_())

现在当我运行这个应用程序时,所有的对象都堆积在一起,看起来像这样:

ExecutedApp

希望能得到任何帮助!
1个回答

2
你的代码主要问题在于你为StartQT4子类使用了错误的基类。它应该与Qt Designer的顶级类匹配,即QDialog
你还可以简化代码,直接将UI添加到你的子类中,并使用新式信号和槽语法。 对照这些更改后,你的代码如下:
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_())

太棒了!完美运作 - 现在我所需要做的就是理解它 :) 非常感谢! - Maciejg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接