一、如何表示窗体的位置,采用坐标体系
先来张图,说明Qt中如何获得窗体的坐标信息。
上图中,有获取窗体信息的函数:
x()、y()、pos()获得整个窗体左上角的位置;
geometry()获得窗体内中央区域的左上角顶点坐标和长、宽;
frameGeometry()获得整个窗体的左上角顶点位置和长、宽。
二、来个例子,展示上述API的作用
来张图,显示结果~
Source Code文件:
Geometry.pro
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG += c++11
SOURCES += \
main.cpp \
geometry.cpp
HEADERS += \
geometry.h
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
geometry.h
#ifndef GEOMETRY_H
#define GEOMETRY_H
#include <QDialog>
class QLabel;
class QGridLayout;
class Geometry : public QDialog
{
Q_OBJECT
public:
Geometry(QWidget *parent = nullptr);
~Geometry();
void updateLabel();
protected:
void moveEvent(QMoveEvent*);
void resizeEvent(QResizeEvent*);
private:
using QLabelPtr = QLabel *;
QLabelPtr xLabel, xValueLabel;
QLabelPtr yLabel, yValueLabel;
QLabelPtr frmLabel, frmValueLabel;
QLabelPtr posLabel, posValueLabel;
QLabelPtr geoLabel, geoValueLabel;
QLabelPtr widthLabel, widthValueLabel;
QLabelPtr heightLabel, heightValueLabel;
QLabelPtr rectLabel, rectValueLable;
QLabelPtr sizeLabel, sizeValueLabel;
QGridLayout *mainLayout;
};
#endif // GEOMETRY_H
geometry.cpp
#include "geometry.h"
#include <QLabel>
#include <QGridLayout>
Geometry::Geometry(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr("Geometry"));
xLabel = new QLabel(tr("x(): "));
xValueLabel = new QLabel;
yLabel = new QLabel(tr("y(): "));
yValueLabel = new QLabel;
frmLabel = new QLabel(tr("Frame: "));
frmValueLabel = new QLabel;
posLabel = new QLabel(tr("pos(): "));
posValueLabel = new QLabel;
geoLabel = new QLabel(tr("geometry(): "));
geoValueLabel = new QLabel;
widthLabel = new QLabel(tr("width(): "));
widthValueLabel = new QLabel;
heightLabel = new QLabel(tr("height(): "));
heightValueLabel = new QLabel;
rectLabel = new QLabel(tr("rect(): "));
rectValueLable = new QLabel;
sizeLabel = new QLabel(tr("size(): "));
sizeValueLabel = new QLabel;
mainLayout = new QGridLayout(this);
mainLayout->addWidget(xLabel, 0, 0);
mainLayout->addWidget(xValueLabel, 0, 1);
mainLayout->addWidget(yLabel, 1, 0);
mainLayout->addWidget(yValueLabel, 1, 1);
mainLayout->addWidget(frmLabel, 2, 0);
mainLayout->addWidget(frmValueLabel, 2, 1);
mainLayout->addWidget(posLabel, 3, 0);
mainLayout->addWidget(posValueLabel, 3, 1);
mainLayout->addWidget(geoLabel, 4, 0);
mainLayout->addWidget(geoValueLabel, 4, 1);
mainLayout->addWidget(widthLabel, 5, 0);
mainLayout->addWidget(widthValueLabel, 5, 1);
mainLayout->addWidget(heightLabel, 6, 0);
mainLayout->addWidget(heightValueLabel, 6, 1);
mainLayout->addWidget(rectLabel, 7, 0);
mainLayout->addWidget(rectValueLable, 7, 1);
mainLayout->addWidget(sizeLabel, 8, 0);
mainLayout->addWidget(sizeValueLabel, 8, 1);
updateLabel();
}
void Geometry::moveEvent(QMoveEvent*) //响应对话框的移动事件
{
updateLabel();
}
void Geometry::resizeEvent(QResizeEvent*) //响应对话框的大小调整事件
{
updateLabel();
}
void Geometry::updateLabel()
{
xValueLabel->setText(QString().setNum(x()));
yValueLabel->setText(QString().setNum(y()));
QString frameStr = QString().setNum(frameGeometry().x()) + ", "
+ QString().setNum(frameGeometry().y()) + ", "
+ QString().setNum(frameGeometry().width()) + ", "
+ QString().setNum(frameGeometry().height());
frmValueLabel->setText(frameStr);
QString posStr = QString().setNum(pos().x()) + ", "
+ QString().setNum(pos().y());
posValueLabel->setText(posStr);
QString geoStr = QString().setNum(geometry().x()) + ", "
+ QString().setNum(geometry().y()) + ", "
+ QString().setNum(geometry().width()) + ", "
+ QString().setNum(geometry().height());
geoValueLabel->setText(geoStr);
widthValueLabel->setText(QString().setNum(width()));
heightValueLabel->setText(QString().setNum(height()));
QString rectStr = QString().setNum(rect().x()) + ", "
+ QString().setNum(rect().y()) + ", "
+ QString().setNum(rect().width()) + ", "
+ QString().setNum(rect().height());
rectValueLable->setText(rectStr);
QString sizeStr = QString().setNum(size().width()) + ", "
+ QString().setNum(size().height());
sizeValueLabel->setText(sizeStr);
}
Geometry::~Geometry()
{
if(xLabel) { delete xLabel; xLabel = nullptr; }
if(xValueLabel) { delete xValueLabel; xValueLabel = nullptr; }
if(yLabel) { delete yLabel; yLabel = nullptr; }
if(yValueLabel) { delete yValueLabel; yValueLabel = nullptr; }
if(frmLabel) { delete frmLabel; frmLabel = nullptr; }
if(frmValueLabel) { delete frmValueLabel; frmValueLabel = nullptr; }
if(posLabel) { delete posLabel; posLabel = nullptr; }
if(posValueLabel) { delete posValueLabel; posValueLabel = nullptr; }
if(geoLabel) { delete geoLabel; geoLabel = nullptr; }
if(geoValueLabel) { delete geoValueLabel; geoValueLabel = nullptr; }
if(widthLabel) { delete widthLabel; widthLabel = nullptr; }
if(widthValueLabel) { delete widthValueLabel; widthValueLabel = nullptr; }
if(heightLabel) { delete heightLabel; heightLabel = nullptr; }
if(heightValueLabel) { delete heightValueLabel; heightValueLabel = nullptr; }
if(rectLabel) { delete rectLabel; rectLabel = nullptr; }
if(rectValueLable) { delete rectValueLable; rectValueLable = nullptr; }
if(sizeLabel) { delete sizeLabel; sizeLabel = nullptr; }
if(sizeValueLabel) { delete sizeValueLabel; sizeValueLabel = nullptr; }
if (mainLayout) { delete mainLayout; mainLayout = nullptr; }
}
main.cpp
#include "geometry.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Geometry w;
w.show();
return a.exec();
}