前言
QT主要是用于构建GUI程序的,所以了解QT基本的一些GUI组件及其构成原理非常重要。
一、QT中QWidget,QMainWindow和QDialog介绍
在我们使用QtCreator创建GUI工程的时候,一般会让我们从QWidget,QMainWindow和QDialog中选取一个主窗口。 在QT中的GUI部件,遵循着非常严格的继承关系,这也是我们需要向QT学习的重要部分,即如何使用利用C++面向对象的语言特性,去搭建一套框架。 QWidget继承自QObject和QPaintDevice,利用继承的特性,QWidget中可以调用QObject和QPaintDevice中的非private部分的特性和函数,另外也可以重写两个父类中的虚函数。这也提示我们,在查询帮助文档的时候,查找某个类中的函数时,如果该类中找不到,需要查找父类中有无该函数。 而QWidget基本是Qt中其它GUI部件的父类。比如QWindow即是在QWidget的基础上添加了,QMenuBar(菜单栏),QToolBar(工具栏),QStatusBar(状态栏)和CentralWidget(中心部件)。所以QMainWindow在继承了QWidget的属性和方法的同时,对其进行了扩充。 QDialog也是同样对QWidget的扩充。
二、QT中的布局
代码如下(示例): QT中的布局可以使用绝对布局(使用绝对尺寸),人工布局和Qt中的布局管理器。前两种方法无法适应在窗口改变时,部件的相对位置,而且维护比较困难,所以一般Qt中的GUI布局使用Qt中的布局管理器。 布局主要有三种形式,水平布局,垂直布局和栅格布局,分别对应QHBoxLayout,QVBoxLayout和QGridLayout。三种布局方式在UI设计师模式下很容易实现,现主要讲解代码实现。 例如下面的代码表示栅格布局的使用方法:
QHBoxLayout layout1=new QHBoxLayout;
layout1->addWidget(lable1)
layout2->addItem(layout1);
nameLabel=new QLabel(tr("姓名:"));
nameLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
ageLabel=new QLabel(tr("年龄:"));
ageLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
numLabel=new QLabel(tr("电话:"));
numLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
nameLineEdit=new QLineEdit();
nameLineEdit->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
ageLineEdit=new QLineEdit();
ageLineEdit->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
numLineEdit=new QLineEdit();
numLineEdit->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
QGridLayout* layout=new QGridLayout;
layout->addWidget(nameLabel,0,0);
layout->addWidget(nameLineEdit,0,1);
layout->addWidget(ageLabel,1,0);
layout->addWidget(ageLineEdit,1,1);
layout->addWidget(numLabel,2,0);
layout->addWidget(numLineEdit,2,1);
另外可以规定QWidget及其子类实例化对象的相关的尺寸属性(sizePolicy),比如minimum,maximum,preffered,expanding,fixed等等,实现在同一个layout中不同对象的大小的设置。
总结
(1)简单介绍了Qt 中GUI部件的一些继承关系,主要介绍了QWidget和QMainWindow和QDialog的继承关系; (2)介绍了Qt中的布局类,及其使用方法;
|