QT:各类位置信息
一、简介
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();
- }
- #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
- #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();
- }