2

我已经在 pyqt4 中创建了一个自定义小部件,我已经对其进行了处理和测试,现在准备将其加载到我的主窗口中。由于它没有出现在设计器中,我需要手动将其手动添加到我的主窗口中。

我的小部件使用 uic 来加载 ui 文件,而不是将其转换为 py 文件(到目前为止它更快更轻松),所以它看起来像这样:

class widgetWindow(QtGui.QWidget):
    def __init__(self, parent = None):
        super(widgetWindow, self).__init__(parent)
        self.ui = uic.loadUi("widget.ui")
    #everything else

现在在我的主类中(为简洁起见)我创建布局,将小部件添加到布局中,然后将其添加到主小部件

class main(QtGui.QMainWindow):
    def __init__(self, parent = None):
        super(main, self).__init__(parent)
        self.ui = uic.loadUi("testWindow.ui")
        mainlayout  = QtGui.QVBoxLayout()
        window = widgetWindow(self)
        mainlayout.addWidget(window)
        centerWidget = QtGui.QWidget()
        centerWidget.setLayout(mainlayout)
        self.ui.setCentralWidget(centerWidget)

没有抛出任何错误,它会为小部件腾出空间,但它根本不会显示任何东西。

添加行 window.ui.show() 只会弹出一个新窗口,覆盖它应该在主窗口上占据的空间。我错过了什么?

4

3 回答 3

2

对 uic 加载器进行更多研究,有两种方法可以加载 ui 文件。我在问题中使用它的方式是一种方式,另一种方式是使用 uic.loadUiType()。这将创建由类对象继承的基类和表单类,而不仅仅是 QtGui.QWidget 类对象。

widgetForm, baseClass= uic.loadUiType("addTilesWidget.ui")

class windowTest(baseClass, widgetForm):
    def __init__(self, parent = None):
        super(windowTest, self).__init__(parent)
        self.setupUi(self)

这样,小部件可以按预期加载到另一个表单中。至于为什么,我还没有找到答案。

有关不同设置类型的更多信息:http: //bitesofcode.blogspot.com/2011/10/comparison-of-loading-techniques.html

于 2012-05-16T18:30:02.970 回答
0

尝试将 parent 参数添加到 loadUi 语句中:

    self.ui = uic.loadUi("widget.ui",parent)
    self.ui = uic.loadUi("testWindow.ui",self)

并在您的主要课程结束时尝试以下行。

    self.setCentralWidget(centerWidget)
于 2012-05-16T07:11:17.597 回答
0

您需要指定“centerWidget”是主窗口的中心小部件。即你的主类代码应该有这样一行: self.setCentralWidget(centerWidget)

class main(QMainWindow):
    def __init__(self, parent = None):            
        super(main, self).__init__(parent)
        ....
        self.setCentralWidget(centerWidget)

于 2012-05-16T07:14:45.033 回答