添加到布局时,窗口小部件的大小不正确

时间:2014-03-14 01:21:03

标签: widget width

我需要在动态添加到布局时获取窗口小部件的真实宽度(),因为我需要根据窗口宽度()在窗口小部件上进行一些绘制。但是下面的代码不能像我预期的那样工作:w.width()总是640,这显然不是真正的宽度。 有什么想法吗?

# -*- coding: utf-8 -*-
import os, sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *  
from PyQt4.QtCore import * 

class MainWidget(QWidget):
    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)

        self.setupUI()

    def setupUI(self):
        self.mainLayout = QVBoxLayout(self)

class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)

        layout = QVBoxLayout(self)
        layout.addWidget(QLabel('label'))

    def minimunSizeHint(self):
        return QSize(30, 30)

    def sizeHint(self):
        return QSize(100, 100)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = MainWidget()
    main.show()

    l = QGridLayout()
    l.addWidget(MyWidget(), 0, 0)
    l.addWidget(MyWidget(), 0, 1)
    l.addWidget(MyWidget(), 1, 0)
    l.addWidget(MyWidget(), 1, 1)
    main.mainLayout.addLayout(l)

    w = l.itemAtPosition(0, 0).widget()
    print w.width(), w.height()


    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

只需重新实现resizeEvent()并在大小改变时重新绘制。

# -*- coding: utf-8 -*-
import os, sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *  
from PyQt4.QtCore import * 

class MainWidget(QWidget):
    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)

        self.setupUI()

    def setupUI(self):
        self.mainLayout = QVBoxLayout(self)

class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)

        layout = QVBoxLayout(self)
        layout.addWidget(QLabel('label'))

    def minimunSizeHint(self):
        return QSize(30, 30)

    def sizeHint(self):
        return QSize(100, 100)

    def resizeEvent(self, event):
        print self.width(), self.height()
        # call painting here

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = MainWidget()
    main.show()

    l = QGridLayout()
    l.addWidget(MyWidget(), 0, 0)
    l.addWidget(MyWidget(), 0, 1)
    l.addWidget(MyWidget(), 1, 0)
    l.addWidget(MyWidget(), 1, 1)
    main.mainLayout.addLayout(l)

    w = l.itemAtPosition(0, 0).widget()

    sys.exit(app.exec_())