zoukankan      html  css  js  c++  java
  • <C++ QT4 GUI 编程>第六章笔记

    管理窗口部件布局的三种方法:

    1、绝对位置法,通过setGeometry()函数设置固定的尺寸和位置,代码如下:

    button1->setGeometry(0,0,50,20);

    button2->setGeometry(0,20+10,50,20);

            lineEdit1->setGeometry(0,2*(20+10),50,20);

            lineEdit2->setGeometry(0,3*(20+10),50,20);

    setFixedSize(200,200);

    这样做有很多缺点:(1)因调用setFixedSize()使用户无法改变窗口大小。(2)当选择了更大的字体或翻译成另一种语言时,可能会改变字体大小导致文本截断。(3)对于某些风格的平台,固定的窗口部件可能具有不适合的尺寸。(4)必须人工计算尺寸和位置,这样做不仅让开发人员感到枯燥,也让后期维护变得困难重重。

    2、人工布局法,这种方法和绝对位置法相似,但不同点是控件尺寸可以根据窗口变化而变化,设置窗口最小尺寸,然后重载resizeEvent()函数,让控件随窗口的拉伸进行尺寸的变化,但也包含绝对位置法的一些缺点。代码如下:

    {

    ....

    setMinimumSize(200,200);    

    resize(300,300);

    ...

    }

    void MainWindow::resizeEvent(QResizeEvent *event)

    {    

    int extraWidth = width() - minimumWidth();    

    int extraHeight = height() - minimumHeight();

        button1->setGeometry(0,0,50,20);     button2->setGeometry(0,20+10+extraHeight,50+extraWidth,20+extraHeight);     lineEdit1->setGeometry(0,2*(20+10+extraHeight),50+extraWidth,20+extraHeight);     lineEdit2->setGeometry(0,3*(20+10+extraHeight),50+extraWidth,20+extraHeight);

    }

    3、布局管理法,这种方法是用布局管理器管理窗口部件,布局管理器管理类主要有QHBoxLayout,QVBoxLayout,QGridLayout等,用法比较简单,代码如下:

    {

    ....

    widget = new QWidget;

    QGridLayout *leftLayout = new QGridLayout;

    leftLayout->addWidget(leftButton1,0,0);

    leftLayout->addWidget(leftButton2,0,1);

    leftLayout->addWidget(leftEdit1,1,0);

    leftLayout->addWidget(leftButton3,1,1);

    leftLayout->addWidget(leftEdit2,2,0,1,2);

    leftLayout->addWidget(leftEdit3,3,0,1,2);

    leftLayout->addWidget(leftEdit4,4,0,1,2);

        

    QVBoxLayout *rightLayout = new QVBoxLayout;

    rightLayout->addWidget(rightButton1);

    rightLayout->addWidget(rightButton2);

    rightLayout->addStretch();

    rightLayout->addWidget(rightEdit1);

    rightLayout->addWidget(rightEdit2);

    QHBoxLayout *mainLayout = new QHBoxLayout;

    mainLayout->addLayout(leftLayout);

    mainLayout->addLayout(rightLayout);

    widget->setLayout(mainLayout);

    setCentralWidget(widget);

    }

    本项目没有添加.ui文件,有.ui文件的话窗口有默认大小值。运行后结果如下:

     

    窗口周围的边白和子窗口部件之间的间隔均设置为默认值,如要改变可以分别调用QLayout::setContentsMargins()QLayout::setSpacing()

    MainWindow中调用setLayout()出现以下错误:

    QWidget::setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout

    原因是MainWindow下默认设置了布局,解决方法是创建一个QWidget实例,将布局添加到QWidget中,然后调用setCentralWidget(QWidget *)QWidget设置为中央窗口显示出来:

    {

    ...

    widget = new QWdget;

    layout = new QGridLayout;

    ...

    widget->setLayout(layout);

    setCentralWidget(widget);

    }

    布局管理法的优点是,当调节窗口大小,有子部件调用show()hide()或改变了大小提示(sizeHnit)时,布局都会重新调整自动适应。

     

    设置子窗口部件大小提示和大小策略可以影响布局:

    涉及大小提示的函数有sizeHint()minimunSizeHint()

    大小策略的函数有setSizePolicy()

     

  • 相关阅读:
    Something about the "BSTR" and "SysStringLen"
    关于 i = i ++ 的问题
    duilib写个三国杀?
    关于WM_GETTEXT的应用
    hoops暂时用过的一些方法
    Hoops随便记的
    C++ win32线程数上限
    windows系统时间(SYSTEMTIME)
    Form表单提交的那些事
    多行文字溢出...
  • 原文地址:https://www.cnblogs.com/qjswxd/p/11868448.html
Copyright © 2011-2022 走看看