• 7817阅读
  • 1回复

【摘录】《KDE2/Qt编程金典》第三章:在窗口中布置部件——3.3 在固定栅格下布置部件 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 正序阅读 楼主  发表于: 2005-08-31
  使用QGridLayout对象可以定义水平和垂直的不可见的栅格线,将部件插入到这些线组成的单元中。下面的例子创建了一个栅格,有5个栅格单元的宽度和高度,在4个单元格中插入按钮。

1     /* main.cpp */
2     #include <kapp.h>
3     #include "fivebyfive.h"
4
5     int main(int argc, char **argv)
6     {
7         KApplication app(argc, argv, "fivebyfive");
8         FiveByFive *fivebyfive = new FiveByFive();
9         fivebyfive->show();
10         app.setMainWidget(fivebyfive);
11         return(app.exec());
12     }

  主程序创建了一个FiveByFive的部件实例,将它作为在KApplication窗口中显示的部件。

1     /* fivebyfive.h */
2     #ifndef FIVEBYFIVE_H
3     #define FIVEBYFIVE_H
4
5     #include <qwidget.h>
6     #include <qpushbutton.h>
7    
8     class FiveByFive: public QWidget
9     {
10     public:
11         FiveByFive(QWidget *parent = 0, const char *name = 0);
12         ~FiveByFive();
13     private:
14         QPushButton *b11;
15         QPushButton *b31;
16         QPushButton *b13;
17         QPushButton *b33;
18     };
19
20     #endif

  头文件定义了FiveByFive类,以QWidget为父类,包含了4个按钮,摆放在栅格中。

1     /* fivebyfive.cpp */
2     #include <qlayout.h>
3     #include "fivebyfive.h"
4    
5     FiveByFive::FiveByFive(QWidget *parent, const char *name)
6         : QWidget(parent, name)
7     {
8         QGridLayout *layout = new QGridLayout(this, 5, 5);
9
10         b11 = new QPushButton("(1,1)", this);
11         b11->setMaximumSize(100, 100);
12         layout->addWidget(b11, 1, 1);
13         b13 = new QPushButton("(1,3)", this);
14         b13->setMaximumSize(100, 100);
15         layout->addWidget(b13, 1, 3);
16         b31 = new QPushButton("(3,1)", this);
17         b31->setMaximumSize(100, 100);
18         layout->addWidget(b21, 3, 1);
19         b33 = new QPushButton("(3,3)", this);
20         b33->setMaximumSize(100, 100);
21         layout->addWidget(b33, 3, 3);
22         for (int i = 0; i < 5; i++)
23         {
24               layout->addRowSpacing(i, 60);
25               layout->addColSpacing(i, 60);
26         }
27         resize(10, 10);
28
29         layout->activate();
30     }
31
32     FiveByFive::~FiveByFive(){}

  在第2行包含了qlayout.h头文件,这个头文件也被用来定义QVBoxLayout和QHBoxLayout,在本章的后面将做进一步介绍。
  在第8行,QGridLayout对象创建为5个单元格宽,5个单元格高,左上角的单元格命名为(0,0),右边紧挨着的为(0,1),下一个为(0,2),依此类推定义所有的单元格。将部件定位到栅格中,使得它离栅格窗口的左边间隔一个单元格,距离上端间隔一个单元格,这样它被放到栅格单元(1,1)中。
  第10行和第11行创建了一个按钮,将它们的最大高度和最大宽度都设置为100像素点。这样,只要单元格小于100x100像素点,那么按钮就将扩充到整个单元格中。通常,按钮不能扩展超出它内部的最大值设置。
  第10行、第11行和第12行用标签"(1,1)"创建了按钮,并把它放置在(1,1)单元格的位置上。第11行调用setMaximumSize()允许按钮扩充它所占的单元格。sizeHint()方法对于很多部件来说是有效的,但不是对全部的部件都有效。在这个例子的情况下,程序正确地认为QPushButton部件返回了一个有效的暗示大小的值,因此在使用前不用进行有效性测试。一般情况下程序的代码应该像下面这样:

    QSize *qsize = b11.sizeHint();
    if (qsize.isValid())
        b11.setMinimumSize(qsize);
    else
        b11.setMinimumSize(30, 30);

  在上面这种情况下,如果部件测试没有返回一个有效的大小设置,那么某些合理的设置将被使用。虽然默认的设置相当好,但是它们几乎都不是你所想要的。
  注意:当编写自己的部件时,可能发现使用sizeHint()是很有用的。这个方法在QWidget中定义为一个实际使用的函数,除非重载它,否则它总是返回一个无效的QSize。
  第23到第26行循环调用addRowSpacing(),设置栅格中的每一行和每一列。设置了每一列的最小宽度和每一行的最小高度,都为60像素点,没有设置最大值,这样每一行和每一列可以扩大到任意大小,如果改变窗口的大小,那么将会看到按钮也同时改变。
  在第27行调用的resize()是请求将整个部件缩小为10x10个像素点。这个部件不能实现这个请求,因为行和列都有最小值设置。无论什么时候进行部件大小的调整,只要新的宽度和高度值超出了最大值和最小值定义的范围,那么新给定的值都将被忽略,而使用最接近的有效值——也就是说,使用最大值或者最小值。在这个例子中,部件将简单地缩小为它的最小值。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线mathbox

只看该作者 1楼 发表于: 2006-10-14
哦,明白了,呵呵,顶下天呐,感谢斑竹
快速回复
限100 字节
 
上一个 下一个