• 9091阅读
  • 2回复

使用layout布局后,怎么获取布局后的某一个控件的尺寸等信息? [复制链接]

上一主题 下一主题
离线dianzi059411
 

只看楼主 倒序阅读 楼主  发表于: 2010-09-30
— 本帖被 XChinux 执行加亮操作(2010-10-22) —
    setWindowFlags(Qt::FramelessWindowHint);
    setGeometry(0, 0, 600, 800);    
/*声明与定义*/
    QLabel* m_labelLeft = new QLabel(this);
    m_labelLeft->setText("this is the left!");
    QLabel* m_labelRight = new QLabel(this);
    m_labelRight->setText("this is the right one !");

/*布局*/
    QHBoxLayout* layout = new QHBoxLayout;
    layout->setContentsMargins(10, 10, 10, 10);
    layout->addWidget(m_labelLeft);
    layout->addWidget(m_labelRight);
    this->setLayout(layout);

/*获取布局结束后的位置与尺寸信息*/
    qDebug()<<m_labelLeft->geometry()->width();
    qDebug()<<m_labelRight->geometry()->width();

如以上代码所示,我在布局结束后获取到的宽度信息,总是为100(可能为QT的默认宽度),但实际显示中显然不是100,请各位大虾指点一下,我怎么才能获取控件的准确的尺寸信息呢?谢谢!
离线dbzhang800

只看该作者 1楼 发表于: 2010-10-01
用法不对,给你一个完整的例子(PyQt4或PySide)
import sys
try:
    from PyQt4 import QtCore, QtGui
except ImportError:
    from PySide import QtCore, QtGui
class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setGeometry(0, 0, 600, 800)
        
        self.labelLeft = QtGui.QLabel("this is the left!", self)
        self.labelRight = QtGui.QLabel("this is the right one", self)
        
        layout = QtGui.QHBoxLayout()
        layout.setContentsMargins(10, 10, 10, 10)
        layout.addWidget(self.labelLeft)
        layout.addWidget(self.labelRight)
        self.setLayout(layout)
        QtCore.QTimer.singleShot(0, self.afterLayout)
        
    def afterLayout(self):
        print self.labelLeft.geometry().width()
        print self.labelRight.geometry().width()
        
    def mouseDoubleClickEvent(self, evt):
        self.close()
app = QtGui.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
离线dianzi059411

只看该作者 2楼 发表于: 2010-10-08
回 1楼(dbzhang800) 的帖子
谢谢这位仁兄!在你提供的思路基础上,我又做了进一步尝试,就是在布局结束后,从键盘事件中去获取并显示布局后的控件的尺寸信息,结果也是正确的,我的结论是:setLayout之后,不能立即去获取控件的尺寸信息,也就是不能在同一个函数内先布局然后立即获取尺寸信息,要在另外一个地方获取,你认为是这样么?如果是的话,为什么会有这样的限制,如果不是的话,请帮忙总结其规律,谢谢!
快速回复
限100 字节
 
上一个 下一个