一、简介
QWidget提供了处理窗口部件的几何布局的函数,分两类:(1)包含窗口边框的处理函数,包括x(), y(), frameGeometry(), pos()和move()。(2)不包含窗口边框的处理函数,包括geometry(), width(), height(), rect(), size()和resize()。
二、运行图
(1)Qt窗口几何布局如下图1所示。
注:Linux采用X11窗口系统,它不用于Windows的一种用户界面技术。在Linux下使用QWidget的这些函数,常会出现一些令人迷惑的现象。
三、详解
1、Linux下位置信息
分析:(1)y()是25,表明Centos系统的菜单栏高度为25。(2)frameGeometry()表明整个窗口长348,宽321。(3)pos表明整个窗口的左上顶点为(0, 25)。(4)geomerty()表明窗口左边框宽2,标题栏宽为51-25=26,用户区框344,右边框宽348-344-2=2,下边框宽321-291-26=4。(5)rect()和size()都为用户中央区域的长宽,rect()左上顶点坐标始终是(0, 0)。
(注:初始化窗体时使用setGeometry()函数会导致窗体show()后在错误的位置停留短暂的一段时间,带来闪烁现象,所以使用resize()和move()函数代替)。
2、Windows下位置信息
(1)x()、y()都是0,从屏幕的最左上角开始。(2)frameGeometry()表明整个窗口长323,宽338。(3)pos表明整个窗口的左上顶点为(0, 0)。(4)geomerty()表明窗口左边框宽8,标题栏宽为30,用户区框307,右边框宽323-307-8=8,下边框宽338-300-30=8。(5)rect()和size()都为用户中央区域的长宽,rect()左上顶点坐标始终是(0, 0)。
3、代码
新建一个项目,继承QDialog即可。
(1)main.cpp
#include "geometry.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QFont font("ZYSong18030",12);
QApplication::setFont(font);
QApplication app(argc,argv);
QTranslator translator(0);
translator.load("geometry_zh",".");
app.installTranslator(&translator);
Geometry *g = new Geometry();
g->show();
return app.exec();
}
(2)geometry.h
#ifndef GEOMETRY_H
#define GEOMETRY_H
#include <QtGui>
class Geometry : public QDialog
{
Q_OBJECT
public:
Geometry();
QLabel *label1;
QLabel *label2;
QLabel *label3;
QLabel *label4;
QLabel *label5;
QLabel *label6;
QLabel *label7;
QLabel *label8;
QLabel *label9;
QLabel *xLabel;
QLabel *yLabel;
QLabel *frameGeoLabel;
QLabel *posLabel;
QLabel *geoLabel;
QLabel *widthLabel;
QLabel *heightLabel;
QLabel *rectLabel;
QLabel *sizeLabel;
void updateLabel();
protected:
void moveEvent(QMoveEvent *);
void resizeEvent(QResizeEvent *);
};
#endif // GEOMETRY_H
(3)geometry.cpp
#include "geometry.h"
#include <QDebug>
#include <QString>
Geometry::Geometry()
{
setWindowTitle(tr("Geometry"));
label1 = new QLabel;
label1->setText("x():");
label2 = new QLabel;
label2->setText("y():");
label3 = new QLabel;
label3->setText("frameGeometry():");
label4 = new QLabel;
label4->setText("pos():");
label5 = new QLabel;
label5->setText("geometry():");
label6 = new QLabel;
label6->setText("width():");
label7 = new QLabel;
label7->setText("height():");
label8 = new QLabel;
label8->setText("rect():");
label9 = new QLabel;
label9->setText("size():");
xLabel = new QLabel;
yLabel = new QLabel;
frameGeoLabel = new QLabel;
posLabel = new QLabel;
geoLabel = new QLabel;
widthLabel = new QLabel;
heightLabel = new QLabel;
rectLabel = new QLabel;
sizeLabel = new QLabel;
QGridLayout *layout = new QGridLayout(this);
layout->setMargin(20);
layout->setSpacing(10);
int l = 0;
int c = 1;
layout->addWidget(label1,0,l);
layout->addWidget(xLabel,0,c);
layout->addWidget(label2,1,l);
layout->addWidget(yLabel,1,c);
layout->addWidget(label3,2,l);
layout->addWidget(frameGeoLabel,2,c);
layout->addWidget(label4,3,l);
layout->addWidget(posLabel,3,c);
layout->addWidget(label5,4,l);
layout->addWidget(geoLabel,4,c);
layout->addWidget(label6,5,l);
layout->addWidget(widthLabel,5,c);
layout->addWidget(label7,6,l);
layout->addWidget(heightLabel,6,c);
layout->addWidget(label8,7,l);
layout->addWidget(rectLabel,7,c);
layout->addWidget(label9,8,l);
layout->addWidget(sizeLabel,8,c);
updateLabel();
}
void
Geometry::updateLabel()
{
QString temp;
QString str_x;
xLabel->setText(str_x.setNum(x()));
QString str_y;
yLabel->setText(str_y.setNum(y()));
QString frameGeo = QString("%1, %2, %3, %4").arg(frameGeometry().x()).arg(frameGeometry().y())
.arg(frameGeometry().width()).arg(frameGeometry().height());
frameGeoLabel->setText(frameGeo);
QString position = QString("%1, %2").arg(pos().x()).arg(pos().y());
posLabel->setText(position);
QString geo = QString("%1, %2, %3, %4").arg(geometry().x()).arg(geometry().y())
.arg(geometry().width()).arg(geometry().height());
geoLabel->setText(geo);
widthLabel->setText(QString::number(width()));
heightLabel->setText(QString::number(height()));
QString rectStr = QString("%1, %2, %3, %4").arg(rect().x()).arg(rect().y())
.arg(rect().width()).arg(rect().height());;
rectLabel->setText(rectStr);
QString sizeStr = QString("%1, %2").arg(size().width()).arg(size().height());
sizeLabel->setText(sizeStr);
}
void
Geometry::moveEvent(QMoveEvent *)
{
updateLabel();
}
void
Geometry::resizeEvent(QResizeEvent *)
{
updateLabel();
}
四、总结
(1)QMainWindow继承了QWidget,那它们的坐标有什么异同了。工具栏、锚接部分和状态栏都算为中央区域吗?
(2)QWidget的坐标系统在QPaint作图时有哪些体现了?
(3)上述问题以后总结,若各位有明白透彻的,可以评论或者联系yang.ao@i-soft.com.cn。先谢过。