一、简介
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();
- }
#include "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
#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();
- }
#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。先谢过。
参考链接:http://blog.youkuaiyun.com/taiyang1987912/article/details/36001753