添加到布局的PyQt4自定义窗口小部件(uic已加载)是不可见的

时间:2012-05-16 05:21:23

标签: python widget custom-controls pyqt4

我已经在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()只会弹出一个新窗口,超出它应该占用主窗口的空间。我错过了什么?

3 个答案:

答案 0 :(得分:2)

对uic loader进行更多研究,有两种方法可以加载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

答案 1 :(得分:0)

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

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

在主课程结束时尝试以下一行。

    self.setCentralWidget(centerWidget)

答案 2 :(得分:0)

您需要指定'centerWidget'是主窗口的中央窗口小部件。 你的 class main 的代码应该有一行代码: self.setCentralWidget(centerWidget)

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

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